题目汇总
这种类型的题目我还没怎么做过。
啊有点点难想,找子问题最优嘛,判断最长的回文序列,那我们就找一个区间最大的回文串,然后再加入新的字符,与当前区间的首部判断,如果是,直接在这个区间去首去尾的区间(首部不能重复匹配呀,自然需要上一个小区的最大串。)的最大值+2,如果不匹配,则看去首区间时的最大值大(新增字符可以与小区间内某个字符匹配)还是去尾区域的最大值(不要新增字符)大。
那我们得从最小的区间找起嘛,找回文串最小的2长度(一个的情况下,自己与自己就不用说了)。
dp[i][j]:i~j区间最大的回文串长度
转移方程:
char[i]==char[j]: dp[i][j] = dp[i+1][j-1]+2
!= : dp[i][j] = max(dp[i+1][j],dp[i][h-1])
初始化:
自己和自己肯定是回文串啊
dp[0][0]~dp[n-1][n-1] =1;
class Solution {
public int longestPalindromeSubseq(String s) {
if(s.length()==0){
return 0;
}
int[][] dp = new int[s.length()][s.length()];
for(int i =0;i<s.length();i++){
dp[i][i] = 1;
}
for(int len =2;len<=s.length();len++){
for(int start=0;start<=s.length()-len;start++){
char cs = s.charAt(start);
int end = len+start-1;
char ce = s.charAt(end);
//System.out.println(" "+end+" "+start);
if(cs==ce){
dp[start][end] = dp[start+1][end-1]+2;
}else{
dp[start][end] = Math.max(dp[start+1][end],dp[start][end-1]);
}
}
}
return dp[0][s.length()-1];
}
}