leetcode 5. 最长回文子串
题意:给定一个非空字符串,返回最长回文子串(注意是返回子串不是返回最长长度)
时间复杂度:O(n^2)
知识点:区间DP
解题思路:暴力做法是直接枚举左右端点并判断是否符合回文这样的复杂度是n^3,长度在1000的条件下会超时。因此考虑只枚举左右端点,根据之前算过的部分进行递推(动态规划)
dp[i][j]表示i到j之间的字符串是否满足回文,得到状态转移方程if(s.charAt(i)==s.charAt(j))dp[i][j]=dp[i+1][j-1];
注意的点:
1,注意变量命名要见名知义(笔者总是写错)
2,区间dp模板
for(int l=1;l<=len;l++){
for(int i=0;i+l-1<len;i++){
int j=i+l-1;
3,注意substring的用法,最后一位不包括(例如,想返回索引是0-1,substring(0,2))
完整代码
class Solution {
public String longestPalindrome(String s) {
int len=s.length(),ans=1,ansl=0;
if(len==1)return s;
boolean [][]dp=new boolean[len][len];
// for(int i=0;i<len;i++){
// for(int j=0;j<len;j++){
// dp[i][j]=false;
// }
// }
// for(int i=0;i<len;i++)dp[i][i]=true;
for(int l=1;l<=len;l++){
for(int i=0;i+l-1<len;i++){
int j=i+l-1;
if(l<=2){
if(s.charAt(i)==s.charAt(j))dp[i][j]=true;
}
else {
if(s.charAt(i)==s.charAt(j))dp[i][j]=dp[i+1][j-1];
}
if(dp[i][j]==true){
ans=l;
ansl=i;
}
}
}
return s.substring(ansl,ansl+ans);
}
}