-
Notifications
You must be signed in to change notification settings - Fork 0
/
Longest Repeating Subsequence.cpp
65 lines (51 loc) · 1.37 KB
/
Longest Repeating Subsequence.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
PROBLEM:
Given a string str, find length of the longest repeating subseequence such that the two subsequence don’t have same string character
at same position, i.e., any i’th character in the two subsequences shouldn’t have the same index in the original string.
Input:
The first line of input contains an integer T denoting the number of test cases. Then T test cases follow. The first line of each test
case contains an integer N denoting the length of string str.
The second line of each test case contains the string str consisting only of lower case english alphabets.
Output:
Print the length of the longest repeating subsequence for each test case in a new line.
Constraints:
1<= T <=100
1<= N <=1000
Example:
Input:
2
3
abc
5
axxxy
Output:
0
2
SOLUTION:
#include <iostream>
using namespace std;
int main() {
int t;
cin>>t;
while(t--)
{
int n,i,j;
cin>>n;
string s;
cin>>s;
int dp[n+1][n+1];
for(i=0;i<=n;i++)
{
for(j=0;j<=n;j++)
{
if(i==0 || j==0)
dp[i][j]=0;
else if(s[i-1]==s[j-1] && i!=j) //Find LCS with string itself
dp[i][j]=1+dp[i-1][j-1]; //except the case when i=j
else
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
}
cout<<dp[n][n]<<endl;
}
return 0;
}