原题链接:
https://leetcode.cn/problems/longest-palindromic-subsequence/description/
完成情况:
解题思路:
该方法用于找到字符串s中最长的回文子序列的长度。通过动态规划的方式,利用一个二维数组dp_longestPalindromeSubseq来记录子序列的长度。首先初始化数组,然后遍历字符串s的元素,从后往前遍历,每次比较当前元素与其他元素是否相同,如果相同则更新dp_longestPalindromeSubseq数组的值,否则取最大值。最终返回dp_longestPalindromeSubseq[0][slen - 1],即字符串s的最长回文子序列的长度。
参考代码:
_516最长回文子序列
package leetcode板块;
import java.util.Map;
public class _516最长回文子序列 {
/**
* 给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。
* 子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。
* @param s
* @return 最长回文子序列的长度
*/
public int longestPalindromeSubseq(String s) {
//和之前的最长公共子序列相同,可以任意删除,但是不能改变顺序,因此考虑前后夹击,每个元素去找一样的元素
int slen = s.length();
int dp_longestPalindromeSubseq [][] = new int[slen +1][slen+1];
//进行字符串元素遍历
for (int i = slen-1;i>=0;i--){
dp_longestPalindromeSubseq[i][i] = 1;
for (int j = i+1;j<slen;j++){
if (s.charAt(i) == s.charAt(j)){
dp_longestPalindromeSubseq[i][j] = dp_longestPalindromeSubseq[i+1][j-1] +2;
}else {
dp_longestPalindromeSubseq[i][j] = Math.max(dp_longestPalindromeSubseq[i+1][j],Math.max(dp_longestPalindromeSubseq[i][j],dp_longestPalindromeSubseq[i][j-1]));
}
}
}
return dp_longestPalindromeSubseq[0][slen - 1];
}
}