Leetcode 5. Longest Palindromic Substring 笔记

94 阅读1分钟

Medium

思路

  • DP
  • 建立一个boolean的二维数组,横轴为sub-string的结束index, 纵轴为开始的index,数组中的每个点标志这这个sub-string值是否相等,相等为true。
  • 给一个i,j 逐步i++, j--,所有条件下都是true,才是回文串
dp[i][j] = (s.charAt(i) == s.charAt(j)) && dp[i+1][j-1]
  • 两层for循环如何扫这个二维数组?
  • 因为每个点都要取决于它左下角的点,所以要先知道它左下方向的值
  • 所以两种方法:
  • 1
for(int j = 0; j < s.length(); j++)
	for(int i = 0; i <= j; i++)
  • 2
for(int i = s.length() - 1; i >= 0; i--)
	for(int j = s.length() - 1; j >= i; j--)
  • 关于substring :
  • java中String元素下标从0开始,substring(a)是从第a个字符开始截取,包含第a个字符。
  • substring(a, b)表示截取下标从a开始到b结束的字符,包含第a个字符但是不包含第b个字符

代码

class Solution {
    public String longestPalindrome(String s) {
        if(s.length() <= 1 || s == null) return s;
        
        String res = "";
        int len = s.length();
        boolean[][] dp = new boolean[len][len];
        
        for(int j = 0; j < len; j++){
            for(int i = 0; i <= j; i++){
                dp[i][j] = (s.charAt(i) == s.charAt(j)) && ((j - i) <= 2 || dp[i + 1][j - 1]);
                if(dp[i][j] && (j - i + 1) > res.length())
                    res = s.substring(i, j + 1);
            }
        }
        
        return res;
    }
}