小明的字符串问题
描述
小明刚刚做完了回文电话号码的问题,觉得意犹未尽,开始思考一个升级版的问题:随便给一个长度不超过1000的字符串s,一定可以找到很多回文子串,例如s="babad",可以找到"bab"和"aba",那么在这些回文子串中,最长的那个子串是什么呢?请你写一个程序帮小明回答这个问题。
如果有多个相同长度的回文子串,请输出最先出现的那个。
注意:
- 你提交的代码将被插入到以下程序框架中一起编译,所以请不要提交全部代码;
- 可以增加自定义函数。
//固定头部开始
#include <stdio.h>
#include <string.h>
//固定头部结束
//你的代码开始
void find_palindrome(char *s, char *r)
{
}
//你的代码结束
//固定尾部开始
int main()
{
char s[1001]= {0}, r[1001] = {0};
scanf("%s", s);
find_palindrome(s, r);
printf("%s", r);
return 0;
}
//固定尾部结束
输入
一个长度不超过1000的字符串,字符串保证不含空格。
输出
最早出现的、最长的那个回文子串
输入样例 1
cbbd
输出样例 1
bb
来源
xmu
#include <stdio.h>
#include <string.h>
void find_palindrome(char *s, char *r)
{
int max_len = 1, start = 0;
int low, high;
for (int ptr_s = 1; ptr_s < (int)strlen(s); ++ptr_s)
{
low = high = ptr_s;
while (low >= 0 && high < (int)strlen(s))
{
if (s[low] != s[high])
break;
if (high - low + 1 > max_len)
{
max_len = high - low + 1;
start = low;
}
low--;
high++;
}
low = ptr_s - 1;
high = ptr_s;
while (low >= 0 && high < (int)strlen(s))
{
if (s[low] != s[high])
break;
if (high - low + 1 > max_len)
{
max_len = high - low + 1;
start = low;
}
low--;
high++;
}
}
for (int ptr_r = 0; ptr_r < max_len; ++ptr_r)
r[ptr_r] = s[start + ptr_r];
r[max_len] = '\0';
}
int main()
{
char s[1001]= {0}, r[1001] = {0};
scanf("%s", s);
find_palindrome(s, r);
printf("%s", r);
return 0;
}