You have been given a string ‘S’. Your task is to find the number of non-empty distinct palindromic subsequences in string ‘S’ and return that number modulo 10^9 + 7.
Note:
1. A string ‘A’ is a subsequence of a string ‘B’ if ‘A’ can be obtained from ‘B’ by deleting several (possibly, zero or all) characters.
2. A sequence is palindromic if it is equal to the sequence reversed.
3. Two sequences A1, A2,... and B1, B2,... are different if there is some ‘i’ for which ‘Ai’ != ‘Bi’.
The first line of the input contains an integer, 'T’, denoting the number of test cases.
The first line of each test case contains a string ‘S’.
Output Format :
For each test case, print the number of non-empty distinct palindromic subsequences modulo 10^9 + 7.
Print the output of each test case in a separate line.
Note :
You do not need to print anything, it has already been taken care of. Just implement the given function.
1 <= T <= 10
1 <= |S| <= 3*10^3
Where |S| denotes the length of ‘S’.
Time limit: 1 sec
2
abc
pppp
3
4
For the first test case, distinct palindromic subsequences are “a”, “b”, and “c”.
For the second test case, distinct palindromic subsequences are “p”, “pp”, “ppp”, “pppp”.
2
aba
pqqr
4
4
Check for every possible subsequence present in the string.
The basic idea is to find all the subsequences of the string and check whether they are palindrome or not. For each character of the string we have two choices with us:
We also use a set to store the distinct subsequences and print the size of the set minus 1 (empty subsequence).
Here is the algorithm:
HELPER(‘S’, ‘IDX’, ‘ST’, ‘CURR’) (where ‘S’ is the given string, ‘IDX’ is the current index, ‘ST’ is the set, ‘CURR’ is the current subsequence which is initialized to “”).
Similarly, call the HELPER function again by including the current character (‘CURR’ + ‘S[IDX]’).
O((2 ^N ) * N), where ‘N’ is the size of the string.
Every character of the string has two choices, whether to include it in a subsequence or not. There are total ‘N’ characters, so the number of possible combinations will be 2 * 2 * 2… (‘N’ times). And for every subsequence, we check whether it is palindrome or not, which takes O(N) time. Therefore, the overall time complexity will be O((2 ^ N) * N).
O(N), where ‘N’ is the size of the string.
The recursive stack for the HELPER function can contain at most the length of the string. Therefore, the overall space complexity will be O(N).