0
点赞
收藏
分享

微信扫一扫

动态规划C++实现

RIOChing 2022-02-16 阅读 58

最近在做动态规划的题 熟悉之后后面再做一个系统总结吧

#include<iostream>
using namespace std;
class Solution {
public:
    string longestPalindrome(string s) {
        int n = s.size();
        if (n < 2) {
            return s;
        }//如果这个字符串小于2那他本身就是自己的最大回文
        int maxLen=1;
        int begin = 0;
        vector<vector<int>> dp(n, vector<int>(n));// dp[i][j] 表示 s[i..j] 是否是回文串sj表示左右边界
      for (int i = 0; i < n; i++) {
            dp[i][i] = true;//左右边界相等则是回文子串
        }

    for(int L=2;L<=n;L++){
        for(int i=0;i<n;i++){
        //  j-i+1=L 右边界减去左边界+1=长度
         int j=L+i-1;
          if (j >= n) {
                    break;
         }
         if(s[i]!=s[j])//如果左右边界上的元素不相等那么就不是回文串 那么这个字串就不是回文子串
         {
            dp[i][j]=false;
         }else {//左右边界相等时
             if(j-i<3){//如果子串的左右边界差值小于3那么他就是真的
                  dp[i][j]=true;
             }else{
                 dp[i][j]=dp[i+1][j-1];//如果他是一个回文那么收紧之后左右边界减1也应是回串
             }
          
         }
         if(dp[i][j]==true&&j-i+1>maxLen){//如果是回文串并且 这个回文子串的长度大于之前的最大长度L=j-i+1>maxLen
              maxLen=j-i+1;//那么最大长度L=j-i+1
              begin=i;
        }
        }
        }
        return s.substr(begin, maxLen);
    }
};
举报

相关推荐

0 条评论