leetcode 5. Longest Palindromic Substring 最长回文 动态规划解答

题目名称:leetcode 5. Longest Palindromic Substring

难度:Medium

知识点:动态规划

解题思路:这道题最简单直观的想法是遍历所有的char,并且以当前char为中心向两边散开,像是打开一个小窗口,不断打开直到左右边际的两个char不再相等或者抵达string边界,即回文不再形成,这个方式是可行的,但是这个方式的问题是,遍历每个char时,都是一个新的中点,前一个遍历点的判断结果不能被reuse。

第二个想法是还是遍历所有的char, 但是不是作为中心,而是作为右边界,窗口是string起点到右边界之间,我们通过不断向右移动左边界来判断当前右边界和和移动的左边界之间形成的窗口是否是回文,在这过程中,通过判断之前存下来的回文状态,我们可以很快的更新现在的最长回文,并记录下来,我们需要一直向右移动左边界,直到到达右边界,因为后面遍历到的的右边界需要前一个右边界的信息,即每一层新的外衣都依赖于内层。

Java代码如下:

class Solution {
    public String longestPalindrome(String s) {
        //dynamic programming
        //if whole string is palindrome then inner string is palindrome
        if(s.length() <= 1) return s;
        int len = s.length();
        boolean[][] dp = new boolean[len][len];
        int maxlen = 1;
        String maxStr = s.substring(0, 1);
        for(int r = 1; r < len; r++){
            for(int l = 0; l < r; l++){
                if(s.charAt(r) == s.charAt(l) && (r-l<=2 || dp[r-1][l+1] == true)){
                    dp[r][l] = true;
                    if(r - l + 1 > maxlen){
                        maxlen = r - l + 1;
                        maxStr = s.substring(l, r+1);  
                    }  
                }
            }
        }
        return maxStr;
    }
}

Reference:

[1] https://liweiwei1419.github.io/leetcode-solution-blog/leetcode-problemset/dynamic-programming/0005-longest-palindromic-substring.html#%E6%96%B9%E6%B3%95%E4%B8%89%EF%BC%9A%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92%EF%BC%88%E6%8E%A8%E8%8D%90%EF%BC%89

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值