难点还是想到动态规划
回文串是经典的动态规划使用场景
因为回文串可以由通过判定头尾,从子串转移过来
至于马拉车算法,饶了我吧,acm退队了,不想卷这种算法了QAQ
顺便提一下,这个用startindex与maxlen来暂存字符串信息挺好的,值得借鉴
另外我使用了maxlen初始值为1来规避掉了标程的特判,也是一个不错的写法~
(java中substring的len溢出会自动给你补终止符)
class Solution {
public String longestPalindrome(String s) {
int len = s.length();
int startIndex = 0;
int maxLen = 1;
//dp[i][j]:从i到j的最长回文串长度
boolean[][] dp = new boolean[len][len];
char[] charArray = s.toCharArray();
for (int i = 0; i < len; i++) {
dp[i][i] = true;
}
for (int j = 1; j < len; j++) {
for (int i = 0; i < j; i++) {
if (charArray[i] != charArray[j]) {
dp[i][j] = false;
} else {
// 2或3都行
if (j - i < 3) {
dp[i][j] = true;
} else {
dp[i][j] = dp[i + 1][j - 1];
}
}
if (dp[i][j] && j - i + 1 > maxLen) {
startIndex = i;
maxLen = j - i + 1;
}
}
}
return s.substring(startIndex, startIndex + maxLen);
}
}