516. 最长回文子序列

516. 最长回文子序列

  • 原题链接:
  • 完成情况:
  • 解题思路:
  • 参考代码:
    • __516最长回文子序列
    • __516最长回文子序列__Again

原题链接:

516. 最长回文子序列

https://leetcode.cn/problems/longest-palindromic-subsequence/description/

完成情况:

516. 最长回文子序列_第1张图片

解题思路:

转化成1143. 最长公共子序列

516. 最长回文子序列_第2张图片
516. 最长回文子序列_第3张图片

516. 最长回文子序列_第4张图片

参考代码:

__516最长回文子序列

package 西湖算法题解___中等题;

public class __516最长回文子序列 {
	/*
	输入:s = "bbbab"
	输出:4
	解释:一个可能的最长回文子序列为 "bbbb" 。
	 */
	//如上述题例,找【最长,长度】的【可以不连续,但是要顺序】的回文子串序列
	public int longestPalindromeSubseq(String s) {
		int sLength  = s.length();
		int [][] dp_longestPalindromeSubseq = new int[sLength][sLength];
		for (int i = sLength-1;i>=0;i--){
			dp_longestPalindromeSubseq[i][i] = 1;
			char ch1 = s.charAt(i);
			for (int j = i+1;j<sLength;j++){
				char ch2 = s.charAt(j);
				if (ch1 == ch2){
					dp_longestPalindromeSubseq[i][j] = dp_longestPalindromeSubseq[i+1][j-1] + 2;
				}else {
					dp_longestPalindromeSubseq[i][j] = Math.max(dp_longestPalindromeSubseq[i+1][j],dp_longestPalindromeSubseq[i][j-1]);
				}
			}
		}
		return dp_longestPalindromeSubseq[0][sLength-1];
	}
}

__516最长回文子序列__Again

package 西湖算法题解___中等题;

public class __516最长回文子序列__Again {
	public int longestPalindromeSubseq(String s) {
		/*
		1 <= s.length <= 1000
		s 仅由小写英文字母组成
		 */
		//两个字符串的 公共子序列 是这两个字符串所共同拥有的子序列。
		StringBuilder s_reverse = new StringBuilder(s);
		s_reverse.reverse();
		int res = longestCommonSubseq(s,s_reverse);
		return res;
	}

	/**
	 *
	 * @param s
	 * @param s_reverse
	 * @return
	 */
	private int longestCommonSubseq(String s, StringBuilder s_reverse) {
		int m = s.length(),n = s_reverse.length();
		int dp_longestPalindromeSubseq [][] = new int[m+1][n+1];
		for (int i = 1;i<=m;i++){
			char ch1_i = s.charAt(i-1);
			for (int j = 1;j<=n;j++){
				char ch2_j = s_reverse.charAt(j-1);
				if (ch1_i == ch2_j){
					dp_longestPalindromeSubseq[i][j] = dp_longestPalindromeSubseq[i-1][j-1] + 1;
				}else {
					dp_longestPalindromeSubseq[i][j] = Math.max(dp_longestPalindromeSubseq[i-1][j],dp_longestPalindromeSubseq[i][j-1]);
				}
			}
		}
		return dp_longestPalindromeSubseq[m][n];
	}
}

你可能感兴趣的:(算法知识,java学习,#,LeetCode题解,数据结构,字符串,leetcode)