-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathshortest_common_supersequence.cpp
72 lines (61 loc) · 1.91 KB
/
shortest_common_supersequence.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
#include<bits/stdc++.h>
using namespace std;
class Solution {
const int INF = 1000 * 1000 * 10;
public:
int solve(const string & s,
const string & t,
vector<vector<int> > & dp,
const int & i,
const int & j,
vector<vector<int> > & bkTrack) {
if(i == s.size() || j == t.size()) {
if(i < s.size()) return s.size() - i;
return t.size() - j;
}
int & ret = dp[i][j];
if(ret != -1) return ret;
ret = INF;
if(s[i] == t[j]) {
ret = 1 + solve(s, t, dp, i + 1, j + 1, bkTrack);
bkTrack[i][j] = 2;
}
int s1 = 1 + solve(s, t, dp, i + 1, j, bkTrack);
int s2 = 1 + solve(s, t, dp, i, j + 1, bkTrack);
if(ret > s1) {
ret = s1;
bkTrack[i][j] = 0;
}
if(ret > s2) {
ret = s2;
bkTrack[i][j] = 1;
}
return ret;
}
string rebuild(vector<vector<int> > & bk, const string & s, const string & t) {
string ret = "";
int i = 0, j = 0;
while(i < s.size() && j < t.size()) {
if(bk[i][j] == 2) {
ret += string(1, s[i]);
j++;
i++;
} else if(!bk[i][j]) {
ret += string(1, s[i]);
i++;
} else {
ret += string(1, t[j]);
j++;
}
}
ret += s.substr(i, s.size() - i);
ret += t.substr(j, t.size() - j);
return ret;
}
string shortestCommonSupersequence(string str1, string str2) {
vector<vector<int> > dp(str1.size(), vector<int>(str2.size(), -1));
vector<vector<int> > bk(str1.size(), vector<int>(str2.size(), -1));
solve(str1, str2, dp, 0, 0, bk);
return rebuild(bk, str1, str2);
}
};