5. 最长回文子串
5. 最长回文子串
难度中等
给你一个字符串 s
,找到 s
中最长的回文子串。
示例 1:
输入:s = "babad" 输出:"bab" 解释:"aba" 同样是符合题意的答案。
示例 2:
输入:s = "cbbd" 输出:"bb"
提示:
1 <= s.length <= 1000
s
仅由数字和英文字母组成
解法: 双指针
以图中字符串为例
1. 使用双指针,左指针 l1 指向首 从左向右遍历,右指针指向尾。外层while(l1 < r1)
2.如果s[l1] != s[r1],表明 l1 r1 当前不是回文串。则 l1 位置不变, r1左移。继续下次循环对比 s[l1] s[r1]是否相等
如果s[l1] == s[r1],表明,l1 rl可能是个回文字符串, 进入子while循环,(l2 r2 是待检查的回文串的左右指针),进行回文串检查,
3. 如果是回文串,记录串长,记录l1位置,取最大的串长
4.存在一个情况就是 “aa”是回文,“aca”也是回文,即s[l2] == s[r2] 候,左指针右移,右指针左移,则左右指针就完美的错过了,位置变成了 r2 l2 ,即l2 = r2+1 。
另一个情况:s[l2] == s[r2] 候,左指针右移,右指针左移 l2 == r2了。
char * longestPalindrome(char * s){
int l1,l2;
int r1,r2;
int len = strlen(s);
int cnt = 0;
int maxcnt = 0;
int ll,rr;
l1 = 0;
r1 = len -1;
while(l1 < len){
if(s[l1] != s[r1]){
r1--;
if(l1 == r1){
l1++;
r1 = len-1;
}
}else{
l2 = l1;
r2 = r1;
while(l2<r2){
if(s[l2]==s[r2]){
l2++;
r2--;
}else{
//l1++; //刚开始这块写错了,如果子串不是回文,l1的位置仍然不动,只挪动r1,右指针
r1--;
break;
}
}
if(l2 == r2 || l2 == (r2+1)){ // 针对第4 点的处理
cnt = r1-l1 +1;
if(maxcnt < cnt){
maxcnt = cnt;
ll = l1;
rr = r1;
}
l1++; //如果是回文串,左指针右移,右指针指向尾,继续检查剩余字符串是否有回文串
r1 = len-1;
}
}
}
s[ll+maxcnt] = '\0'; //截取回文串
s = s+ll;
return s;
}