
Input: ‘N’ = 5, ‘M' = 2, ‘STR’ = “abcde” , ‘ARR’ = [“ad”, “cb”]
Output: 1
In this case, string “ad” occurs as a subsequence in the string ‘STR’ and the index of the match is ‘0’ and ‘3’ respectively. Also, string “cb” isn’t a subsequence because there is no occurrence of ‘b’ after the first ‘c’ at index ‘2’. Hence the output will be ‘1’.
The first line will contain the integer ‘T’, the number of test cases.
The first line of each test case contains two integers, ‘N’ and ‘M’ , denoting the length of string and array respectively.
Followed by a line containing the string ‘STR’ of length.
Followed by ‘M’ lines, each containing the string of the array ‘ARR’.
For each test case, print the count of strings in the array ‘ARR’ that occurs as a subsequence in the string ‘STR’.
You don't need to print anything. It has already been taken care of. Just implement the given function.
1 <= ‘T’ <= 10
1 <= ‘N’ <= 10^4
STR.length = N
1 <= ‘M’ <= 10^4
‘STR’ only consists of lowercase English letters.
It is guaranteed that sum of ‘N’ over all test cases is <= 10^5
It is guaranteed that sum of lengths of strings in array ‘ARR’ over all test cases is <= 10^5
Time Limit: 1 sec
The idea for this approach is to maintain the index of the matching element. So for every string of array ‘ARR’, we will start out iteration from ‘0’ up to ‘N-1’ for string ‘STR’, let's denote the current index of iteration to be ‘i’. Now for the string of array ‘ARR’ to be a subsequence of string ‘STR’, the order of characters should match, hence we can start with index ‘j = 0’ for the above iteration, and whenever ‘STR[i]’ matches the ‘jth’ index if the current string of ‘ARR’, we increment ‘j’. If at the end if ‘j’ is equal to the length of the current string of the array ‘ARR’, then we can say that the current string is a subsequence in string ‘STR’.
We will follow the same process for every string of ‘ARR’ and update the answer by ‘1’, whenever found a string that satisfies the above-mentioned condition.
Algorithm:
// The function will return the count of strings that are subsequence in the string ‘STR’.
Int subsequenceGame(N, M, STR, ARR)
In the previous approach, we are iterating on the string ‘STR’ again and again to check if the current string of array ‘ARR’ is a subsequence in it or not. Now to optimize that we can preprocess some information of string ‘STR’ in such a way that any string that is its subsequence can directly jump to the indexes that match it.
We can do this by dynamic programming, we will iterate on the string ‘STR’ in reverse order, by maintaining the nearest index of the occurrence of every alphabet from ‘a’ to ‘z’ for every ‘i’ ∈ ‘[0, N-1]’. We are storing the nearest index because we want to use the same information for all subsequences, hence we will try to use minimal characters in the string ‘STR’ to complete the string matching.
But as the approach will become complicated if we follow 0-based indexing, hence we will follow 1-based indexing for storing this information, we will first insert a non-English character at the start of the string ‘STR’ and then maintain the above-mentioned information for ‘i’ ∈ ‘[0, N]’, where each index ‘i’ will have the information about the nearest occurrence of every alphabet from ‘a’ to ‘z’ for the whole suffix ‘[i+1, N]’. To initialize the 2D ‘dp’ array we will give them the value of any index that is out of bound of string ‘STR’ i.e. (N+1).
In the below idea we consider the alphabets ‘a’ as ‘0’, ‘b’ as ‘1’, … and ‘z’ as ‘25’ when compared with a number.
Algorithm:
// The function will return the count of strings that are subsequence in the string ‘STR’.
Int subsequenceGame(N, M, STR, ARR)