Leetcode 005 最长回文子串

地址 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);
    }
};

猜你喜欢

转载自www.cnblogs.com/itdef/p/12930979.html
今日推荐