题解 | #最长公共子序列(二)#
最长公共子序列(二)
http://www.nowcoder.com/practice/6d29638c85bb4ffd80c020fe244baf11
从后往前遍历每个字符,然后再反转
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* s1和s2最长公共子序列的长度
* @param s1 string字符串
* @param s2 string字符串
* @return int整型
*/
string LCS(string s1, string s2) {
// write code here
vector<vector<int> > dp(2005,vector<int>(2005,0));
//先对边界进行初始化
string res = "";
int n = s1.size();
int m = s2.size();
if(s1.size() == 0 || s2.size() == 0) return "-1";
for(int i = 0; i < s1.size(); i++){
dp[i][0] = 0;
}
for(int j = 0; j < s2.size(); j++){
dp[0][j] = 0;
}
for(int i = 1; i <= s1.size(); i++){
for(int j = 1; j <= s2.size(); j++){
//注意数组下标是从1开始取得,那么在取实际得数值时需要-1
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]);
}
}
}
if(dp[n][m] == 0){
return "-1";
}
//逆序查找
for(int i = s1.length(),j= s2.length(); dp[i][j] >= 1;){
if(s1[i-1] == s2[j-1]){
res += s1[i-1];
i--;
j--;
}
else if(dp[i-1][j] >= dp[i][j-1]) i--;
else j--;
}
reverse(res.begin(), res.end());
return res;
}
};