对于这种问题可以采用中心遍历法,可以分为两种情况,一种是中心字符串长度为1,一种是中心字符串长度为2的时候。
1.1个的时候

这时候我们要遍历字符串,第一次循环的时候选择S[0]为中心字符串,然后比较S[0]左右有多少字符串是相等的(对称),显然S[0]左边没有字符,所以第一次遍历结束,然后进行第二次循环的时候选择S[1]为中心字符串,以此类推。
2.2个时候
需要选择两个字符作为中心字符,之后就和上面奇数时相似。
3.需要特别注意的时候是需要同时遍历当中心字符为1个或2个的时候
当字符串长度为奇数时有一种特殊情况,比如acbba,如果只考虑中心字符为1则输出是a,如果考虑中心字符串为2,则输出bb。
我自己的代码
char* longestPalindrome(char* s) {
int len=strlen(s);
int maxlength=1;
int start=0;
for(int i=0;i<len;i++)//中心字符为2个
{
int right=i;
int left=i;
while(left>=0&&right<len&&s[right]==s[left])
{
right++;
left--;
}
if(right-left-1>maxlength)
{
start=left+1;
maxlength=right-left-1;
}
}
for(int i=0;i<len;i++)//中心字符为2个
{
int right=i+1;
int left=i;
while(left>=0&&right<len&&s[right]==s[left])
{
right++;
left--;
}
if(right-left-1>maxlength)
{
start=left+1;
maxlength=right-left-1;
}
}
char* result=(char*)malloc(sizeof(char)*(maxlength+1));
strncpy(result,s+start,maxlength);//以s[start]为起点,复制maxlength长度的字符串到result
result[maxlength]='\0';
return result;
}
601

被折叠的 条评论
为什么被折叠?



