给定一个字符串s,找到其中最长的回文子序列。可以假设s的最大长度为1000。
示例 1:
输入:
“bbbab”
输出:
4
一个可能的最长回文子序列为 “bbbb”。
示例 2:
输入:
“cbbd”
输出:
2
一个可能的最长回文子序列为 “bb”。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-palindromic-subsequence
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
代码如下
class Solution {
public int longestPalindromeSubseq(String s) {
if(s.length()<1)
return 0;
int [][]dp=new int[s.length()][s.length()];
for(int i=0;i<s.length();i++) {
dp[i][i]=1;
for(int j=i-1;j>=0;j--) {
if(s.charAt(j)==s.charAt(i)) {
dp[j][i]=dp[j+1][i-1]+2;
}else {
dp[j][i]=Math.max(dp[j+1][i],dp[j][i-1]);
}
}
}
return dp[0][s.length()-1];
}
}
贴一个我的错误想法(借鉴于中心匹配)
测试用例str=“euazbipzncptldueeuechubrcourfpftcebikrxhybkymimgvldiwqvkszfycvqyvtiwfckexmowcxztkfyzqovbtmzpxojfofbvwnncajvrvdbvjhcrameamcfmcoxryjukhpljwszknhiypvyskmsujkuggpztltpgoczafmfelahqwjbhxtjmebnymdyxoeodqmvkxittxjnlltmoobsgzdfhismogqfpfhvqnxeuosjqqalvwhsidgiavcatjjgeztrjuoixxxoznklcxolgpuktirmduxdywwlbikaqkqajzbsjvdgjcnbtfksqhquiwnwflkldgdrqrnwmshdpykicozfowmumzeuznolmgjlltypyufpzjpuvucmesnnrwppheizkapovoloneaxpfinaontwtdqsdvzmqlgkdxlbeguackbdkftzbnynmcejtwudocemcfnuzbttcoew”
正确结果=159
class Solution {
public int longestPalindromeSubseq(String s) {
int length=s.length();
int max=1;
for(int i=0;i<length;i++) {
int l=longestLength(i,i,s);
int r=longestLength(i,i+1,s);
max=Math.max(Math.max(r,l),max);
}
return max;
}
private static int longestLength(int start, int end, String s) {
int left=0;
int right=0;
if(start==end) {
left=1;
right=1;
}else {
left=2;
right=2;
}
int sta=--start;
int e=++end;
while(start>=0&&end<s.length()) {
if(s.charAt(start)==s.charAt(end)) {
left+=2;
start--;
end++;
}else {
start--;
}
}
while(sta>=0&&e<s.length()) {
if(s.charAt(sta)==s.charAt(e)) {
right+=2;
sta--;
e++;
}else {
e++;
}
}
//System.out.println(Math.max(left, right));
return Math.max(left, right);
}
}