最长回文子串(二维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);
    }
};
最长回文子串是指一个字符串中的最长回文子串。在 Java 中,可以使用动态规划的方法来解决这个问题。 首先,定义一个二维数组 dp[][],其中 dp[i][j] 表示字符串从索引 i 到 j 的子串是否是回文子串。初始化时,将所有 dp[i][i] 设置为 true,表示单个字符是回文子串。 然后,通过遍历字符串的长度和起始索引来更新 dp[][] 数组。具体的更新规则如下: 1. 当 s.charAt(i) == s.charAt(j)(j - i <= 2 || dp[i+1][j-1] == true) 时,dp[i][j] 也为 true。这意味着如果当前字符相等,并且子串长度小于等于2或者去掉首尾字符后的子串是回文子串,则当前子串也是回文子串。 2. 在更新 dp[][] 数组的过程中,记录最长回文子串的起始索引和长度。 以下是使用动态规划解决最长回文子串问题的 Java 代码示例: ```java public class LongestPalindromeSubstring { public static String longestPalindrome(String s) { int n = s.length(); boolean[][] dp = new boolean[n][n]; int maxLength = 1; int start = 0; // 初始化单个字符为回文子串 for (int i = 0; i < n; i++) { dp[i][i] = true; } // 更新 dp[][] 数组并记录最长回文子串的起始索引和长度 for (int len = 2; len <= n; len++) { for (int i = 0; i <= n - len; i++) { int j = i + len - 1; if (s.charAt(i) == s.charAt(j) && (len <= 2 || dp[i+1][j-1])) { dp[i][j] = true; if (len > maxLength) { maxLength = len; start = i; } } } } return s.substring(start, start + maxLength); } public static void main(String[] args) { String s = "babad"; String longestPalindrome = longestPalindrome(s); System.out.println("最长回文子串为: " + longestPalindrome); } } ``` 运行上述代码,输出结果为: ``` 最长回文子串为: bab ``` 以上就是使用动态规划解决最长回文子串问题的 Java 实现方法。希望能对你有所帮助!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小胡同的诗

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

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

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

打赏作者

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

抵扣说明:

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

余额充值