题目描述
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
样例
示例 1:
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
示例 2:
输入: "cbbd"
输出: "bb"
算法1
1 遍历 以每个字符为中心 进行验证 注意包括 baab 和 bab 两种奇偶方式的回文
2 动态规划 dp[i][j] 为范围i到j的回文,那么我们判断加入元素[i] [j]相等 也是回文
3 马拉车算法。。。。 Manacher’s Algorithm 马拉车算法, 这个了解一下
C++ 代码
遍历方案
class Solution {
public:
int ansLen = 1; int ansl = 0; int ansr = 0;
void FindLongestPalindrome(string s, int l, int r)
{
while (l >= 0 && l < s.size() && r >= 0 && r < s.size() && s[l] == s[r]) {
if (ansLen < r - l + 1) {ansLen = r - l + 1; ansl = l; ansr = r;}
l--; r++;
}
}
string longestPalindrome(string s) {
int n = s.size();
for (int i = 1; i < n; i++) {
if (s[i - 1] == s[i]) {
int l = i - 1; int r = i;
FindLongestPalindrome(s, l, r);
}
if (s[i - 1] == s[i + 1]) {
int l = i; int r = i;
FindLongestPalindrome(s, l, r);
}
}
string retstr = s.substr(ansl, ansLen);
return retstr;
}
};
class Solution {
public:
string longestPalindrome(string s) {
vector<vector<int>> vv;
for(int i = 0; i < s.size();i++){
vector<int> v(s.size(),0);
vv.push_back(v);
}
int len = 0; int right= 0; int left =0;
for(int i = 0;i<s.size();i++){
for(int j = 0;j < i;++j){
vv[j][i] = (s[i]==s[j] && ((i-j < 2) || vv[j+1][i-1]) );
if(vv[j][i] && len< i-j+1){
len = i-j+1;
left =j;
right =i;
}
}
vv[i][i] = 1;
}
return s.substr(left,right-left+1);
}
};
没有马拉车吗😁
Y总说一半在线写代码不考,而且也那么复杂。想想还是算了
+1