The first line of input contains an integer βTβ representing the number of test cases. Then the test cases follow.
The only line of each test case contains a single string βAβ consisting of only lowercase English letters.
For each test case, print a single integer denoting the length of the longest palindromic subsequence in string βAβ.
The output for each test case is in a separate line.
You do not need to print anything, it has already been taken care of. Just implement the given function.
1 <= T <= 10
1 <= N <= 10 ^ 2
Where βTβ is the number of test cases, and βNβ is the length of the string.
Time limit: 1 sec.
The main idea behind this approach is to use recursion. The idea is to compare the first character of the string A[i..j] with its last character. There are two possibilities:
Let A[0..n-1] be the input string of length n and L(0, n-1) be the length of the longest palindromic subsequence of A[0..n-1].
If the first and last characters of A are the same, then L(0, n-1) = L(1, n-2) + 2.
Else L(0, n-1) = MAX (L(1, n-1), L(0, n-2)).
Following is a general recursive solution with all cases handled.
The LPS (Longest Palindromic Subsequence) has an optimal substructure and also exhibits overlapping subproblems. Let us consider a recursion tree for a sequence of length 6 having all distinct characters (say βabcdefβ) whose LPS length is 1.
As we can see, the same sub-problems (highlighted in the same color) are getting computed again and again. We know that problems having optimal substructure and overlapping subproblems can be solved by dynamic programming, in which subproblem solutions are memoized rather than being computed again and again. Like other typical Dynamic Programming (DP) problems, recomputations of the same subproblems can be avoided by constructing a temporary array DP[][] in a bottom-up manner.
In the bottom-up approach, we calculate the answer to small subproblems and then move to the bigger subproblems.
We will consider the state DP[i][j] to store the length of the longest palindromic subsequence of substring [i, j] of the given string.
First we store the answer to the base subproblem (DP[i][i] = 1). Next, we iterate over all possible lengths in increasing order, as we need to start from smaller subproblems and reach the bigger ones.
For the range [i, j]:
Finally, the answer to the full problem is stored inside DP[0][n - 1], where βnβ is the length of the given string.