C++力扣5 最长回文子串(中等)

动态规划来填表!分几步。

第一步:检验填表顺序对不对

class Solution {
public:
    string longestPalindrome(string s) {
        int dp[s.size()][s.size()];
        memset(dp,0,sizeof(dp));
        int start = 0, max = 0;
        // 填数
        for(int t=1; t<s.size(); t++){
            for(int i=0; i<s.size()-t; i++){
                dp[i][i+t] = t;
            }
        }
        // 打印
        for(int i=0; i<s.size(); i++){
            for(int j=0; j<s.size(); j++){
                cout << dp[i][j] << "      ";
            }
            cout << endl;
        }
        return "";
    }
};

打印结果:(表明填表顺序是对的)

0      1      2      3      4      
0      0      1      2      3      
0      0      0      1      2      
0      0      0      0      1      
0      0      0      0      0      

第二步:开始填表

class Solution {
public:
    string longestPalindrome(string s) {
        int dp[s.size()][s.size()];
        memset(dp,0,sizeof(dp));
        int start = 0, max_len = 0;

        for(int t=0; t<s.size(); t++){
            for(int i=0; i<s.size()-t; i++){
                // 前后相同,为1
                if(s[i] == s[i+t]){
                    dp[i][i+t] = 1;
                }
                // 里面不同,为0
                if(t>=2 && dp[i+1][i+t-1]==0){
                    dp[i][i+t] = 0;
                }
                // 判断最大长度
                if(dp[i][i+t]==1 && t>max_len){
                    start = i;
                    max_len = t;
                }
            }
        }

        // for(int i=0; i<s.size(); i++){
        //     for(int j=0; j<s.size(); j++){
        //         cout << dp[i][j] << "      ";
        //     }
        //     cout << endl;
        // }
        // cout << start << "   " << start+max_len << endl;
        return s.substr(start, max_len+1);
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值