- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
四、执行结果

五、举一反三
给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。
子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-palindromic-subsequence
示例 1:
输入:s = “bbbab”
输出:4
解释:一个可能的最长回文子序列为 “bbbb” 。
示例 2:
输入:s = “cbbd”
输出:2
解释:一个可能的最长回文子序列为 “bb” 。
其实本题可以理解为最长公共子序列的变形,我们可以这么想回文子序列的正序和倒序是相同,那么我把字符串s
反转表示为s'
,那么最终转化为求两字字符串的最长子序列的长度,代码实现如下所示:
public class Solution2 {
public int longestPalindromeSubseq(String s) {
int n = s.length();
int[][] dp = new int[n + 1][n + 1];
char[] cs1 = s.toCharArray();
char[] cs2 = new StringBuilder(s).reverse().toString().toCharArray();
for(int i = 1 ; i <= n; i++){
for(int j = 1; j <= n; j++){
if(cs1[i-1] == cs2[j -1]){
dp[i][j] = dp[i-1][j-1] +1;
}else{
dp[i][j] = Math.max(dp[i-1][j],dp[i][j-1]);
}
}
}
return dp[n][n];
}
public static void main(String[] args){
String s = "aabaaba";
Solution2 solution = new Solution2();
System.out.println(solution.longestPalindromeSubseq(s));
}
}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
class="hide-preCode-box">
评论记录:
回复评论: