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;
}
标签:子串,r1,r2,l2,l1,回文,最长,指针 来源: https://www.cnblogs.com/xiaomingjun/p/16122260.html