leet5:5. 最长回文子串

本文介绍了一种使用动态规划算法解决寻找字符串中最长回文子串问题的方法。通过构建二维布尔数组来记录子串是否为回文,算法能够高效地找到最长的回文子串。

动态规划

public static String longestPalindrome(String s) {
    int len = s.length();
    if (len <= 1) {
        return s;
    }
    int longestPalindrome = 1;
    String longestPalindromeStr = s.substring(0, 1);
    boolean[][] dp = new boolean[len][len];
    // abcdedcba
    //   l   r
    // 如果 dp[l, r] = true 那么 dp[l + 1, r - 1] 也一定为 true
    // 关键在这里:[l + 1, r - 1] 一定至少有 2 个元素才有判断的必要
    // 因为如果 [l + 1, r - 1] 只有一个元素,不用判断,一定是回文串
    // 如果 [l + 1, r - 1] 表示的区间为空,不用判断,也一定是回文串
    // [l + 1, r - 1] 一定至少有 2 个元素 等价于 l + 1 < r - 1,即 r - l >  2

    // 写代码的时候这样写:如果 [l + 1, r - 1]  的元素小于等于 1 个,即 r - l <=  2 ,就不用做判断了

    // 因为只有 1 个字符的情况在最开始做了判断
    // 左边界一定要比右边界小,因此右边界从 1 开始
    for (int r = 1; r < len; r++) {
        for (int l = 0; l < r; l++) {
            // 区间应该慢慢放大
            // 状态转移方程:如果头尾字符相等并且中间也是回文
            // 在头尾字符相等的前提下,如果收缩以后不构成区间(最多只有 1 个元素),直接返回 True 即可
            // 否则要继续看收缩以后的区间的回文性
            // 重点理解 or 的短路性质在这里的作用
            if (s.charAt(l) == s.charAt(r) && (r - l <= 2 || dp[l + 1][r - 1])) {
                dp[l][r] = true;
                if (r - l + 1 > longestPalindrome) {
                    longestPalindrome = r - l + 1;
                    longestPalindromeStr = s.substring(l, r + 1);
                }
            }
        }
    }
    return longestPalindromeStr;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值