class Solution {
public:
/**
* longest common subsequence
* @param s1 string字符串 the string
* @param s2 string字符串 the string
* @return string字符串
*/
string LCS(string s1, string s2) {
// write code here
int len1= s1.length();
int len2 = s2.length();
if(len1 <= 0 || len2 <= 0)
return "";
//dp[i][j]表示串s1的前i个字符和串s2的前J个字符有公共子序列
vector<vector<int> >dp(len1 +1, vector<int>(len2 + 1, 0) );
vector<vector<int> >flag(len1 + 1, vector<int>(len2 + 1, 0));
//st存放序列
stack<char>st;
//动态转移方程:
//dp[i][j] = (s1[i - 1] == s2[j - 1] ? dp[i-1][j-1] + 1 : max(dp[i-1][j],dp[i][j-1]))
for(int i = 1; i < len1 + 1; i++){
for(int j = 1; j < len2 + 1; j++){
if(s1[i - 1] == s2[j - 1]){
dp[i][j] = dp[i - 1][j - 1] +1;
flag[i -1][j - 1] = 1;
}
else{
if(dp[i-1][j] >= dp[i][j - 1]){
dp[i][j] = dp[i-1][j];
flag[i - 1][j -1] = 2;
}else{
dp[i][j] = dp[i][j - 1];
flag[i - 1][j - 1]= 3;
}
}
}
}
for(int i = len1 - 1,j = len2 - 1; i >= 0 && j >= 0 ; ){
if(flag[i][j] == 1){
st.push(s1[i]);
i--;
j--;
}else if(flag[i][j] == 2){
i--;
}else if(flag[i][j] == 3){
j--;
}
}
string str;
while(st.size()){
str += st.top();
st.pop();
}
return str;
}
};