题目描述
给定一个字符串s
,找到s
中最长的回文子串。
输入输出样例
Input: s = "babad"
Output: "bab"
对于这样一个字符串,不止存在一个最长回文子串。可以是bab或aba。
题解
对于这个题目,如果使用翻转的话。对于aacxycaa
,反转之后是aacyxcaa
,这时最长公共子串为aac
,但是正确的回文子串为aa
,所以这种方法不可以使用。
这个题目,应该思考如何使用双指针。对于寻找回文串的问题的关键之处在于:从中间开始向两边扩散来判断。首先我们需要先找到这个最长字符串,但是对于字符串来说,它们的个数可能是奇数或是偶数。对于偶数来说,寻找s[i]为中心的回文串;对于奇数,寻找s[i]和s[i+1]为中心的回文串。在寻找的过程中,应该注意边界限制。具体代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| class Solution { public: string longestPalindrome(string s) { string res; for (int i = 0; i <s.size(); i++) { string s1 = Palindrome(s,i,i); string s2 = Palindrome(s,i,i+1);
res = res.size() > s1.size() ? res : s1; res = res.size() > s2.size() ? res : s2; } return res; } string Palindrome(string& s,int l, int r) { while (l >= 0 && r < s.size() && s[l] == s[r]) { l--,r++; }
return s.substr(l+1, r-l-1); } };
|