forked from ankit-kaushal/cs-algorithms
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMerge-String
103 lines (89 loc) · 1.87 KB
/
Merge-String
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
/*input
1
4 4
abab
baba
*/
/*
Merging two strings into one string such that :
1. For each string, their character occurs in the same relative order in Merged string as it occurs in the base strings,
2. The minimum number of blocks consisting of consecutive identical characters is minimum in Merged string.
*/
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long int ll;
typedef long int ln;
#define s(x) scanf("%d", &x)
#define loop(i, n) for(i =0 ; i<n ;i++)
int fun(char s[], char str[],int n, int m)
{
int a[m+1][n+1];
for(int i =0; i<=n ;i ++)
{
a[0][i]= i;
}
for(int i =1; i<=m ;i ++)
{
a[i][0]= i;
}
for(int i =1; i<= m ; i++)
{
for(int j =1 ; j<= n; j++)
{
if( str [i-1] == s[j-1] )
a[i][j] = min(a[i][j-1], min(a[i-1][j], a[i-1][j-1])) +1;
if( str [i-1] != s[j-1] )
a[i][j]= min (a[i][j-1], a[i-1][j])+1;
}
}
return a[m][n];
}
int main()
{
int t;
cin >> t;
while(t--)
{
int n,m , i ,j;
cin >> n>> m;
string x,b;
cin >>x>>b;
int k =1;
for ( i =1; i< n; i++)
{
if( x[i] != x[i-1])
k++;
}
n=k;
char s[n];
s[0]=x[0];k=1;
for ( i =1; i< x.size(); i++)
{
if( x[i] != x[i-1])
{
s[k]=x[i];
k++;
}
}
k =1;
for ( i =1; i< m; i++)
{
if( b[i] != b[i-1])
k++;
}
m=k;
char str[k];
str[0]=b[0];k=1;
for ( i =1; i< b.size(); i++)
{
if( b[i] != b[i-1])
{
str[k]=b[i];
k++;
}
}
int ans = fun(s, str, n, m);
cout<<ans<<endl;
}
return 0;
}