- Leetcode 5.最长回文子串
因为回文串天生具有状态转移的性质,所以这是一道典型的二维dp问题。 - 确定状态:需要创建一个二维数组,行列分别代表两个指针,j指针先行,i指针紧跟其后,每个 arr[i][j] 代表i 到 j 是否是一个回文串。
转移方程:因为判断一个子串是否是回文串,需要判断这个子串的最大子串是否是回文串,若charArray[i] == charArray[j] 且它的最大子串也是回文串,则这个字符串是回文串。即: Arr[i][j] = arr[i + 1][j –1] (charArrar[i] == charArray[j])
初始条件:因为单个字符就是一个回文串,所以arr[i][i] == true
计算顺序:可以先写列,然后写行,在表格的右上方,也可以先写i,再写j,在表格左下方。
class Solution {
public String longestPalindrome(String s) {
int len = s.length();
char[] charArray = s.toCharArray();
boolean[][] res = new boolean[len][len];
int begin = 0;
int maxLen = 1;
for (int i = 0; i < len ; i++) { //初始条件
res[i][i] = true;
}
for (int j = 0; j < len ; j++) {
for (int i = 0; i < j ; i++) {
if (charArray[i] != charArray[j]) { //若两边字符不相等,则i~j必然不是回文串
res[i][j] = false;
}
else {
if (j - i < 3) { //类似于"bab"这样的字符串的判断
res[i][j] = true;
}
else { //若最大子串为回文串,则该字符串为回文串
res[i][j] = res[i + 1][j - 1];
}
}
if (res[i][j] && j - i + 1 > maxLen) { //刷新最长回文串长度
begin = i;
maxLen = j - i + 1;
}
}
}
return s.substring(begin, begin + maxLen);
}
}
因为是两个for循环嵌套,所以时间复杂度O(n^2)
用到了二维数组,所以空间复杂度也是O(n^2).
大一小白一个,官方题解只看懂了dp,写一下题解,做下题目总结,这是第一篇刷题总结,希望坚持下去,在未来看到刷题成果,感谢力扣,让我认识到我就是个废物。