LeetCode5.最长回文子串
题目描述:
给你一个字符串 s,找到 s 中最长的回文子串。
示例 1:
输入:s = “babad”
输出:“bab”
解释:“aba” 同样是符合题意的答案。
示例 2:
输入:s = “cbbd”
输出:“bb”
提示:
1 <= s.length <= 1000
s 仅由数字和英文字母组成
思路: 回文子串有两种情况:
1: 奇数形式: abcba
2: 偶数形式: abba
用res字符串来存储最长回文子串:
奇数形式: 遍历字符串,每次以第i个字符为中心,在不越界的情况下只要左右两边的字符相同就向左右两边扩展一次,每次比对当前res中截取的回文子串长度和扩展得到的回文子串长度,如果更长的话res进行重新截取
偶数形式:遍历字符串,每次以第i个字符和第i+ 1 个字符为中心,在不越界的情况下只要左右两边的字符相同就向左右两边扩展一次,每次比对当前res中截取的回文子串长度和扩展得到的回文子串长度,如果更长的话res进行重新截取
代码:
class Solution {
public:
string longestPalindrome(string s) {
string res;
//回文串有两种情况:
//1: 奇数形式: aba
//2:偶数形式: abba
for(int i = 0; i < s.size(); i++)
{
//1:奇数形式:
//以i为中心,每次向两边扩展,看能否找到关于i对称的回文子串
int l = i - 1, r = i + 1;
while(l >= 0 && r <= s.size() && s[l] == s[r]) l--, r++;、
//当以i为中心的回文串无法继续扩展时,从(l + 1)到 (r - 1)就是最长的回文串
//长度为: r - 1 - (l + 1) + 1 = r - l - 1
//如果之前存储的回文子串长度小于当前遍历得到的回文子串长度,那么res重新截取子串存储
if(res.size() < r - l - 1) res = s.substr(l + 1, r - l -1);
//偶数形式:
//以i和i相邻的两个字符开始扩展,每次对应即可
l = i, r = i + 1;
while(l >= 0 && r <= s.size() && s[l] == s[r]) l--, r++;
if(res.size() < r - l - 1) res = s.substr(l + 1, r - l - 1);
}
return res;
}
};
纯享版:
class Solution {
public:
string longestPalindrome(string s) {
string res;
for(int i = 0; i < s.size(); i++)
{
int l = i - 1, r = i + 1;
while(l >= 0 && r <= s.size() && s[l] == s[r]) l--, r++;
if(res.size() < r - l - 1) res = s.substr(l + 1, r - l - 1);
l = i, r = i + 1;
while(l >= 0 && r <= s.size() && s[l] == s[r]) l--, r++;
if(res.size() < r - l - 1) res = s.substr(l + 1, r - l - 1);
}
return res;
}
};