5. 最长回文子串(动态规划、中心扩散)

题目描述

leetcode - 5:https://leetcode-cn.com/problems/longest-palindromic-substring/submissions/

题目描述

解题关键

  • 动态规划
  • 中心扩散(比较好理解)

代码

1、暴力(会超时)

  • 时间复杂度O(N^3),N 是字符串的长度
  • 空间复杂度O(1)
bool testStr(string s){
    int flag = true;
    int start= 0;
    int end = s.size()-1;
    while( start <= end ){
        if( s[start++] != s[end--] )
            flag = false;
    }
    return flag;
}

string longestPalindrome(string s) {
    string ans;
    string test;
    for(int i=0;i<s.size();i++){
        for(int j=1;j<=s.size()-i;j++){
            test = s.substr(i, j);
            if(testStr(test) && test.size()>ans.size()){
                ans = test;
            }
        }
    }
    return ans;
}

2、动态规划
状态转移方程:dp[i][j] = (s[i] == s[j]) and dp[i + 1][j - 1]
i和j是指s[i-j]的子字符串是不是回文串

  • 时间复杂度O(N^2),N 是字符串的长度
  • 空间复杂度O(N)
string longestPalindrome(string s) {
    string ans=s.substr(0,1);
    int len = s.size();
    if(len == 0) return s;
    bool dp[len][len];
    for(int i=0;i<len;i++){
        dp[i][i]=true;
    }
    for(int j=1;j<len;j++){
        for(int i=0;i<j;i++){
            if(s[i]!=s[j])
                dp[i][j] = false;
            else{
                if(j-i<3){
                    dp[i][j] = 1;
                }else{
                    dp[i][j] = dp[i+1][j-1];
                }
            }  
            if(dp[i][j] && j-i+1 > ans.size())
                ans = s.substr(i, j-i+1);
        }
    }
    return ans;
}

3、中心扩散

  • 时间复杂度O(N^2),N 是字符串的长度
  • 空间复杂度O(N)
string longestPalindrome(string s) {
    int len = s.size();
    if(len < 1 ) return s;
    string ansLen;
    for(int i=0;i<len;i++){
        int len1 = test(s,i,i);     // 奇数
        int len2 = test(s,i,i+1);   // 偶数
        if(len1>len2){
            ansLen = ansLen.size() > len1 ? ansLen: s.substr(i-len1/2,len1);
        }else{
            ansLen = ansLen.size() > len2 ? ansLen: s.substr(i-len2/2+1,len2);
        }
    }
    return ansLen;
}

int test(string s,int left, int right){
    int l=left,r=right;
    while( l>=0 && r<=s.size() && s[l]==s[r] ){
        l--;
        r++;
    }
    return r-l-1;
}
posted @ 2020-05-31 01:11  _Sleeping  阅读(294)  评论(0)    收藏  举报