最长回文子串(二维DP)

题目链接LeetCode5
在这里插入图片描述
思路:除了马拉车算法和中心扩散法外的一种通用高效的算法,核心思路是优化暴力中查子串是否为回文串的二维DP

class Solution {
public:
    string longestPalindrome(string str) {
        int len = str.size();
        bool dp[1005][1005]; //dp[i][j]表示第i个到第j个的子串是否为回文串
        memset(dp, false, sizeof(dp));
        for (int i = 1; i <= len; i++) {
            dp[i][i] = true; //单个字符显然是回文串
            if (i-1>0 && str[i-1] == str[i-2]) //相邻相等的情况
                dp[i-1][i] = true;
        }
        //如果str(i+1...j-1)是回文的话,并且str[i]==str[j],显然str(i...j)也是回文
        //整个问题的子问题就找到了,不难发现每次的状态都是从上上轮转移过来的
        for (int j = 3; j <= len; j++)
            for (int i = 1; i+j-1 <= len; i++)
                if (dp[i+1][i+j-2] && str[i-1] == str[i+j-2])
                    dp[i][i+j-1] = true;
        //这样爆搜就能够降到O(n^2),因为判断某个串是否为回文串就能O(1)查出
        int start = 1, length = 1;
        for (int i = 1; i <= len; i++)
            for (int j = i+1; j <= len; j++)
                if (dp[i][j] && length < j-i+1)
                    start=i, length=j-i+1;
        return str.substr(start-1, length);
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小胡同的诗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值