地址 https://leetcode-cn.com/problems/longest-palindromic-substring/
给定一个字符串 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 马拉车算法, 这个了解一下
方案1
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; } };
方案2
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); } };