LeetCode 5 题解

简介: LeetCode 5 题解

LeetCode 5 题解


给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

示例 1:


输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。

示例 2:


输入: "cbbd"
输出: "bb"

思路:动态规划


动态转移方程

dp[i][j] = dp[i+1][j-1] && (s[i]==s[j])

边界条件:

当只有一个字符时候dp[i][i+0] = true

当有两个字符时:dp[i][i+1] =(s[i]==s[i+1])


public class LeetCode5 {
    public String longestPalindrome(String s) {
        /**
         *  动态转移方程
         *  dp[i][j] = dp[i+1][j-1] && (s[i]==s[j])
         *  
         *  边界条件:
         *  l 表示 字符长度
         *  dp[i][j] = true;
         *  l = 1 时  dp[i][j] = (s[i]== s[j])
         */
        char[] charArray = s.toCharArray();
        int len = s.length();
        boolean[][] dp = new boolean[len][len];
        String ans = "";
        for(int l = 0; l < len; l++){// 长度为0 1 到len-1 
             for(int i = 0; i < len;i++){// 开始位置是 i
                 int j = i + l; // 结束位置是j
                 if(j >= len ) break;
                 if(l == 0){ // 边界条件,单个字段是回文
                     dp[i][j]= true;
                 }else if(l == 1){// 边界条件 两个字符需要判断
                     dp[i][j] = (charArray[i] == charArray[i+1]);
                 }else{
                     dp[i][j] = dp[i+1][j-1]&&(charArray[i]==charArray[j]);
                 }
                 if(dp[i][j] && l+1 > ans.length()){
                     ans = s.substring(i,j+1); // 包含位置 j
                 }
             }
        }
        return ans;
    }
    /**
     * @param args
     */
    public static void main(String[] args) {
//        String s = "babad";
//        String s = "cbbd";
        String s = "a";
        System.out.println(new LeetCode5().longestPalindrome(s));
    }
}
相关文章
|
5月前
|
存储
leetcode2题解
Leetcode2两数相加的题解
24 2
|
5月前
leetcode3题解
leetcode3的题解
22 1
|
5月前
leetcode209题解
leetcode209题解
32 0
|
5月前
|
算法
leetcode4题解
leetcode4题解
26 0
Leetcode contests 93 题解
870. Advantage Shuffle 起始就是hdoj 1502田忌赛马,但要求的结果不一样而已。这里我用了个pair来记录B中每个数字对应的位置。
44 0
|
数据安全/隐私保护
[UTCTF2020]babymips 题解
[UTCTF2020]babymips 题解
70 1
Leetcode contests 95 题解
用容斥原理可以计算出一个数字Num之下有多少个A或B的倍数cnt,我们从最大值二分这个数字Num,拿cnt和N做比较来决定二分的走向,最终l和r肯定会收敛到一起,这就是我们要的结果了。 这道题的数值范围不是特别大 ,用long就可以完全满足需求了。
24 0
|
数据安全/隐私保护
CrackRTF 题解
CrackRTF 题解
58 0
|
Go 数据安全/隐私保护
世上无难事题解
世上无难事题解
85 0
世上无难事题解