-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathlongest_repeating_subsequence.cpp
82 lines (52 loc) · 1.44 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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
/*
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
*/
#include<bits/stdc++.h>
using namespace std;
int LRS(string s1, string s2, int n, int m){
int dp[n+1][m+1];
for(int i=0;i<n+1;i++) dp[i][0]=0;
for(int j=0;j<m+1;j++) dp[0][j]=0;
for(int i=1;i<n+1;i++){
for(int j=1;j<m+1;j++){
if(s1[i-1]==s2[j-1] && i!=j)
dp[i][j]=1 + dp[i-1][j-1];
else dp[i][j]=max(dp[i][j-1], dp[i-1][j]);
}
}
return dp[n][m];
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int t;
cin>>t;
while(t--){
int n;
cin>>n;
string s1,s2;
cin>>s1;
s2=s1;
cout<<LRS(s1,s2,n,n)<<endl;
}
return 0;
}