一、题意
给你一个字符串 s,找到 s 中最长的回文子串。
二、解法
解法一:
 动态规划
 
    
     
      
       
        d
       
       
        p
       
       
        [
       
       
        i
       
       
        ]
       
       
        [
       
       
        j
       
       
        ]
       
      
      
       dp[i][j]
      
     
    dp[i][j]代表了i到j是否是回文子串,由s[i]==s[j]和其之间字符子串
    
     
      
       
        d
       
       
        p
       
       
        [
       
       
        i
       
       
        +
       
       
        1
       
       
        ]
       
       
        [
       
       
        j
       
       
        −
       
       
        1
       
       
        ]
       
      
      
       dp[i+1][j-1]
      
     
    dp[i+1][j−1]是否是回文子串
 以上是j-i>2的情况。
 
    
     
      
       
        d
       
       
        p
       
       
        [
       
       
        i
       
       
        ]
       
       
        [
       
       
        i
       
       
        ]
       
      
      
       dp[i][i]
      
     
    dp[i][i]是回文子串
 
    
     
      
       
        d
       
       
        p
       
       
        [
       
       
        i
       
       
        ]
       
       
        [
       
       
        i
       
       
        +
       
       
        1
       
       
        ]
       
       
        =
       
       
        s
       
       
        [
       
       
        i
       
       
        ]
       
       
        =
       
       
        =
       
       
        s
       
       
        [
       
       
        i
       
       
        +
       
       
        1
       
       
        ]
       
      
      
       dp[i][i+1]=s[i]==s[i+1]
      
     
    dp[i][i+1]=s[i]==s[i+1]
 时间复杂度:
    
     
      
       
        O
       
       
        (
       
       
        
         n
        
        
         2
        
       
       
        )
       
      
      
       O(n^2)
      
     
    O(n2)
 空间复杂度:
    
     
      
       
        O
       
       
        (
       
       
        
         n
        
        
         2
        
       
       
        )
       
      
      
       O(n^2)
      
     
    O(n2)
 解法二:
 中心扩展法
三、代码
解法一:
    string longestPalindrome(string s) {
        int n=s.length();
        vector<vector<int>> dp(n,vector<int>(n,0));
        for(int i=0;i<n;i++){
            dp[i][i]=1;
        } 
        int begin = 0;
        int maxLen = 1;
        for(int m=1;m<n;m++){
            for(int i=0;i<n;i++){
                int j=m+i;
                if(j>=n){
                    break;
                }
                if(s[i]==s[j]){
                    if(j-i<3){
                    dp[i][j]=1;
                    }
                    else{
                        dp[i][j]=dp[i+1][j-1];
                    }
                }
                else{
                    dp[i][j]=0;
                }
                if(dp[i][j]==1&&j-i+1>maxLen){
                    maxLen = j-i+1;
                    begin=i;
                }
            }
        }
    return s.substr(begin,maxLen);
    }
四、总结
先放着,后面再来补其他方法。









