Solving Leetcode Interviews in Seconds with AI: Longest Palindromic Subsequence
Introduction
In this blog post, we will explore how to solve the LeetCode problem "516" using AI. LeetCode is a popular platform for preparing for coding interviews, and with the help of AI tools like Chatmagic, we can generate solutions quickly and efficiently - helping you pass the interviews and get the job offer without having to study for months.
Problem Statement
Given a string s, find the longest palindromic subsequence's length in s. A subsequence is a sequence that can be derived from another sequence by deleting some or no elements without changing the order of the remaining elements. Example 1: Input: s = "bbbab" Output: 4 Explanation: One possible longest palindromic subsequence is "bbbb". Example 2: Input: s = "cbbd" Output: 2 Explanation: One possible longest palindromic subsequence is "bb". Constraints: 1 <= s.length <= 1000 s consists only of lowercase English letters.
Explanation
Here's the solution to find the length of the longest palindromic subsequence:
Dynamic Programming: Utilize dynamic programming to store and reuse results of subproblems. The
dp[i][j]entry will store the length of the longest palindromic subsequence of the substrings[i:j+1].Bottom-Up Approach: Build the
dptable from smaller substrings to larger ones. Start with substrings of length 1 and gradually increase the length.Palindrome Check: If
s[i]ands[j]are equal, thendp[i][j] = dp[i+1][j-1] + 2. Otherwise,dp[i][j] = max(dp[i+1][j], dp[i][j-1]).Time & Space Complexity: O(n^2) time complexity and O(n^2) space complexity, where n is the length of the string
s.
Code
def longestPalindromeSubseq(s: str) -> int:
n = len(s)
dp = [[0] * n for _ in range(n)]
# Base case: single characters are palindromes of length 1
for i in range(n):
dp[i][i] = 1
# Fill the dp table in a bottom-up manner
for length in range(2, n + 1):
for i in range(n - length + 1):
j = i + length - 1
if s[i] == s[j]:
if length == 2:
dp[i][j] = 2
else:
dp[i][j] = dp[i + 1][j - 1] + 2
else:
dp[i][j] = max(dp[i + 1][j], dp[i][j - 1])
return dp[0][n - 1]