第五题最长回文子串
这道题做法比较多,时间复杂度为O(n)的马拉车算法我还没看明白,这里只讲我用的动态规划的方法。
dp[j][i]表示从j到i的字符串是否是回文子串。
dp[i][i]=true,dp[i][i+1]=(s[i]==s[i+1])。
其他情况,只有s[j+1,i-1]是回文子串,并且是s[i]==s[j],s[i,j]才是回文子串。
即dp[j][i]=(s[i]==s[j] && dp[j+1][i-1])。
class Solution {
public String longestPalindrome(String s) {
int n = s.length();
boolean[][] dp = new boolean[n][n];
char[] c = s.toCharArray();
int l,r;
l = r = 0;
for (int i=0;i<n;i++){
for (int j=0;j<i;j++){
if (i - j < 3) {
dp[j][i] = (c[i] == c[j]);
} else {
dp[j][i] = (c[i] == c[j] && dp[j+1][i-1]);
}
if (dp[j][i] && (r-l <= i-j)) {
r = i;
l = j;
}
}
}
return s.substring(l, r+1);
}
}