原题描述:
给你一个字符串 s
,找到 s
中最长的回文子串。
如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。
示例 1:
输入:s = "babad" 输出:"bab" 解释:"aba" 同样是符合题意的答案。
示例 2:
输入:s = "cbbd" 输出:"bb"
提示:
1 <= s.length <= 1000
s
仅由数字和英文字母组成
题目分析:
本题的思路很简单,就是一个循环for(int i=0;i<strlen(s)-1;i++),然后循环内部再套一层循环for(int j=i+1;j<len;j++),再第二层循环内部判断从s[i]到s[j]是不是回文串,是的话该回文串的长度(即j-i+1)与前一个最长回文子串的长度max作比较,max取较大值,如果发现新的最长回文子串的末尾已经到了s[len-1]的位置,说明后面已经没有更长的子串了,就退出双层循环,返回这个子串即可。
代码展示:
bool ispali(char *s,int begin,int end)
{
int i=begin,j=end;
while(i<j)
{
if(s[i]!=s[j]) return false;
i++,j--;
}
return true;
}
char * longestPalindrome(char * s){
if(strlen(s)<2) return s;//max的最小值是1
int begin=0,end=0;
int max=1;
int len=strlen(s);
for(int i=0;i<len-1;i++)
{
for(int j=i+1;j<len;j++)
{
if(ispali(s,i,j)&&max<j-i+1)
{
max=j-i+1;
begin=i,end=j;
if(j==len-1) goto loop;
}
}
}
loop:;
s[end+1]='\0';
return s+begin;
}
注意:
1、函数要求返回最长子串,而不是它的长度,所以要有两个变量begin和end时刻记录最长字串的起点和终点,最后将s[end+1]赋值成'\0',返回s+begin即可
2、在找到j==len-1的最长回文子串后,这个子串的长度一定是整个字符串的回文子串的最大长度,此时需要退出两层循环,break只能退出所在那一层的循环,这里就可以用到goto语句。goto语句是个无条件转向语句,再程序中要慎用。