题目描述
给你一个字符串 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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
C++
回文串的判断方法是简单的:从两边向中间,不断比较头尾字符是否相同即可。
思路:
中心扩展法: 遍历每一个字符,向两边扩展找到以其为中心的最长回文子串, 所有找到的回文子串的最大长度即所求 。
class Solution {
public:
/*
中心扩展法
遍历每个字符,以每个字符为中心向两边扩散,求以其为中心的回文串的最大长度。
时间复杂度 O(n^2)
*/
string longestPalindrome(string s) {
string res;
int len=s.size();
if(!len) return res;
if(len==1) return s;
int max_len=1;
int left=0;
for(int i=0;i<len;i++)
{
int k1=expand(s,len,i-1,i+1); //奇数形式回文串
int k2=expand(s,len,i,i+1); //偶数形式的回文串
int len1=2*k1+1;
int len2=2*k2;
if(max_len<len1){
max_len=len1;
left=i-k1;
}
if(max_len<len2){
max_len=len2;
left=i-k2+1;
}
}
return s.substr(left,max_len);
}
int expand(string& s,int len, int left,int right){
int res=0;
while(left>=0 && right<len){
if(s[left]==s[right])
{
left--;
right++;
res++;
}
else{
break;
}
}
return res;
}
};
最长公共字串法:
字符串反转后和原字符串的最长公共子串就是最长回文子串 。
求最长公共字串使用动态规划法;
参考链接
该博客介绍了如何解决寻找给定字符串中最长回文子串的问题。通过中心扩展法,遍历每个字符并尝试扩展为回文串,从而找到最长的回文子串。此外,还提及了利用字符串反转来寻找最长公共子串的方法作为另一种解决方案。
834

被折叠的 条评论
为什么被折叠?



