LeetCode 1682. Longest Palindromic Subsequence II Solution in Java, C++, Python & Go | Explanation + Code

CoderIndeed
0
1682. Longest Palindromic Subsequence II

Description

A subsequence of a string s is considered a good palindromic subsequence if:

  • It is a subsequence of s.
  • It is a palindrome (has the same value if reversed).
  • It has an even length.
  • No two consecutive characters are equal, except the two middle ones.

For example, if s = "abcabcabb", then "abba" is considered a good palindromic subsequence, while "bcb" (not even length) and "bbbb" (has equal consecutive characters) are not.

Given a string s, return the length of the longest good palindromic subsequence in s.

 

Example 1:

Input: s = "bbabab"
Output: 4
Explanation: The longest good palindromic subsequence of s is "baab".

Example 2:

Input: s = "dcbccacdb"
Output: 4
Explanation: The longest good palindromic subsequence of s is "dccd".

 

Constraints:

  • 1 <= s.length <= 250
  • s consists of lowercase English letters.

Solutions

Solution 1: Memorization Search

We design a function dfs(i, j, x) to represent the length of the longest "good" palindrome subsequence ending with character x in the index range [i, j] of string s. The answer is dfs(0, n - 1, 26).

The calculation process of the function dfs(i, j, x) is as follows:

  • If i >= j, then dfs(i, j, x) = 0;
  • If s[i] = s[j] and s[i] ≠ x, then dfs(i, j, x) = dfs(i + 1, j - 1, s[i]) + 2;
  • If s[i] ≠ s[j], then dfs(i, j, x) = max(dfs(i + 1, j, x), dfs(i, j - 1, x)).

During the process, we can use memorization search to avoid repeated calculations.

The time complexity is O(n2 × C). Where n is the length of the string s, and C is the size of the character set. In this problem, C = 26.

PythonJavaC++Go
class Solution: def longestPalindromeSubseq(self, s: str) -> int: @cache def dfs(i, j, x): if i >= j: return 0 if s[i] == s[j] and s[i] != x: return dfs(i + 1, j - 1, s[i]) + 2 return max(dfs(i + 1, j, x), dfs(i, j - 1, x)) ans = dfs(0, len(s) - 1, '') dfs.cache_clear() return ans(code-box)

Post a Comment

0Comments

Post a Comment (0)

#buttons=(Accept !) #days=(20)

Our website uses cookies to enhance your experience. Check Now
Accept !