给定一个字符串 s
,找到 s
中最长的回文子串。你可以假设 s
的最大长度为 1000。
示例 1:
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
示例 2:
输入: "cbbd"
输出: "bb"
char * longestPalindrome(char * s){
int max_level=0;//回文字符串长度
int max_position=0;
int tmp_level=1;
int center_position=0;//回文字符串长度 回文字符串中心位置
int total_len=strlen(s);
if(total_len<1||total_len>1000)return "";
while(center_position+max_level/2<total_len&¢er_position+tmp_level/2<total_len)
{//
if(center_position-(tmp_level-1)/2<0)
{
center_position++;
continue;
}
int find=1;
for(int left=center_position-(tmp_level-1)/2,right=center_position+tmp_level/2;left<=right;left++,right--)
{
if(s[left]!=s[right])
{
find=0;
break;
}
}
if(0==find)
{
tmp_level++;
if(center_position+tmp_level/2<total_len&&(center_position-(tmp_level-1)/2)>=0)
{
find=1;
for(int left=center_position-(tmp_level-1)/2,right=center_position+tmp_level/2;left<=right;left++,right--)
{
if(s[left]!=s[right])
{
find=0;
break;
}
}
}
}
if(find)
{
find=0;
printf("center_position:%d max_level %d tmp_level %d \n",center_position,max_level,tmp_level);
max_level=tmp_level;
max_position=center_position;
}
else
{
center_position++;
}
tmp_level=max_level+1;
}
if(max_level==0)return "";
char *return_str=(char *)malloc ((max_level+1)*sizeof(char));
strncpy(return_str,s+max_position-(max_level-1)/2,max_level);
return_str[max_level]='\0';
return return_str;
}
执行用时 : 20 ms, 在Longest Palindromic Substring的C提交中击败了91.09% 的用户
内存消耗 : 7.2 MB, 在Longest Palindromic Substring的C提交中击败了80.99% 的用户
提交过程中出现了几个问题:
1.一开始分配了一块大小为字符串长度的内存存储回文字符串,提示堆溢出,保存位置最后再计算回文字符串则消除该错误
2.忽略了单字符的情况