LeetCode 5 题解

2020-08-18 09:59:45 浏览数 (1)

LeetCode 5 题解

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

示例 1:

代码语言:javascript复制
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。

示例 2:

代码语言:javascript复制
输入: "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])

代码语言:javascript复制
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));
    }
}

0 人点赞