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
for(int i = 0
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;
}
}