我觉得栈的入栈和出栈 + 动态规划好理解些,相比于递归
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* longest common subsequence
* @param s1 string字符串 the string
* @param s2 string字符串 the string
* @return string字符串
*/
string LCS(string s1, string s2) {
if(s1.length() == 0 || s2.length() == 0)
return "-1";
int len1 = s1.length();
int len2 = s2.length();
vector<vector<int>> dp(len1 + 1, vector<int>(len2 + 1, 0));
for(int i = 1; i <= len1; i++){
for(int j = 1; j <= len2; j++)
//遇到两个字符相等
if(s1[i - 1] == s2[j -1])
//来自于左上方
dp[i][j] = dp[i - 1][j - 1] + 1;
//遇到的两个字符不同
else
//来自左边或者上方的最大值,
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
}
//从动态规划数组末尾开始
int i = len1, j = len2;
stack<char>s;
while(dp[i][j])
{
if(dp[i][j] == dp[i-1][j])
i--;
else if(dp[i][j] == dp[i][j-1])
j--;
else if(dp[i][j] > dp[i-1][j-1])
{
i--;
j--;
//只有左上方向才是字符相等的情况,入栈,逆序使用
s.push(s1[i]);
}
}
//用于存储字符串
string res = "";
while(!s.empty())
{
res += s.top();
s.pop();
}
//为空返回“-1”;
return res != "" ? res : "-1";
}
};