题目:5. 最长回文子串
思路:动态规划
数组dp[i][j]
表示s[i:j]
是否是一个动态数组。
我们先枚举子串的长度,再枚举子串的起始位置,填充dp
数组。
- 如果子串长度是1,那么它必定是一个回文串;
- 如果子串长度是2,那么只有两个字母相等才是回文串;
- 如果子串长度大于等于3,那么
dp[i][j] = dp[i+1][j-1] && s[i]==s[j]
。因为若dp[i][j]
是回文,则dp[i+1][j-1]
也是。
代码:
class Solution {
public String longestPalindrome(String s) {
int len = s.length();
boolean[][] dp = new boolean[len][len];
int minLen = 0;
String res = "";
// 枚举子串长度
for (int l = 0; l < len; l++) {
// 枚举子串起始位置
for (int begin = 0; begin < len - l; begin++) {
if (0 == l) {
dp[begin][begin + l] = true;
}
else if (1 == l) {
dp[begin][begin + l] = (s.charAt(begin) == s.charAt(begin + l));
}
else {
dp[begin][begin + l] = dp[begin + 1][begin + l - 1] && (s.charAt(begin) == s.charAt(begin + l));
}
if (dp[begin][begin + l] && l + 1 > minLen) {
minLen = l;
res = s.substring(begin, begin + l + 1);
}
}
}
return res;
}
}