<题目表述>
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: “babad”
输出: “bab”
注意: “aba” 也是一个有效答案。
<原题链接>
https://leetcode-cn.com/problems/longest-palindromic-substring/
<思路>
本题初步思路是可以采用一个游标r和两个判断回文串的下标p和q,每次p向左移动q向右移动,然后比较s[p]和s[q]的值,直到不相等时退出,并将q-p+1与已知最长回文串长相比,再决定是否更新最长长度。
<样例代码>
class Solution {
public:
string longestPalindrome(string s) {
int p = 0,
q = p + 1 ,
sSize = s.length() - 1;
int r = p;
int arr[2] = { 0,0 }; //记录最长回文串起始下标位置。
int sum1 = 0;
if (s.length() <= 1)
return s;
//偶数情况(abba)
while (r < sSize)
{
while (p > 0 && q < sSize && s[p - 1] == s[q + 1] && s[p] == s[q])
{
p--;
q++;
}
if (s[p]==s[q] && q - p + 1 > sum1)
{
sum1 = q - p + 1; //更新最长回文串长度
arr[0] = p;
}
r++;
p = r;
q = p + 1;
}
//奇数情况(aba)
int sum2 = 0;
p = q = 0; r = p; //起始pq位置相同
while (r < sSize)
{
while (p > 0 && q < sSize && s[p - 1] == s[q + 1])
{
p--;
q++;
}
if (s[p]==s[q] && q - p + 1 > sum2)
{
sum2 = q - p + 1; //更新长度,同上
arr[1] = p;
}
r++;
p = q = r;
}
if (sum1 > sum2)
return s.substr(arr[0], sum1);
else
return s.substr(arr[1], sum2);
}
};