5. 最长回文子串
Posted 我要出家当道士
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了5. 最长回文子串相关的知识,希望对你有一定的参考价值。
目录
1、Question
给你一个字符串
s
,找到s
中最长的回文子串。示例 1:
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。示例 2:
输入:s = "cbbd"
输出:"bb"示例 3:
输入:s = "a"
输出:"a"示例 4:
输入:s = "ac"
输出:"a"提示:
1 <= s.length <= 1000
s 仅由数字和英文字母(大写和/或小写)组成来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-palindromic-substring
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2、Analysis
思路比较简单,中心开花。遍历字符串( i 从 0 开始),以 i 作为中心点向两边同时扩散,每扩散一次就进行一次比较,遇到字符不一样的则结束扩散。
上面的思路对于奇数个回文字符很有效,对于偶数个回文字符还需要多做些工作。首先我们需要知道为什么会出现偶数(举例:abba),是因为中间的两个字符是重复的,所以我们可以将中间重复的共同作为中心点。在选中 i 后先不急着向两边扩散,先将 i 周围与 i 位置字符一样的包含进去,共同作为中心点。
3、Code
char * longestPalindrome(char * s){
int len = strlen(s), i = 0, j = 0, k = 0;
int maxLen = 1, maxS = 0, maxE = 0;
for ( i = 0; i < len - 1; i++)
{
j = i - 1;
k = i + 1;
while (j >= 0 && s[j] == s[i]) j--;
while (k < len && s[k] == s[i]) k++;
while( j >= 0 && k < len)
{
if (s[j] != s[k]) break;
j--;
k++;
}
j++;
k--;
if (maxLen < (k - j + 1))
{
maxLen = k - j + 1;
maxS = j;
maxE = k;
}
}
s[maxE + 1] = '\\0';
return s + maxS;
}
4、Execution
以上是关于5. 最长回文子串的主要内容,如果未能解决你的问题,请参考以下文章