关键是要在动态规划的过程中如果不相等的时候要保存那个最大的。然后基于此原理得到的dp,然后在倒着遍历,知道对应的元素相同添加上就行了。注意空值处理。
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 string result; int f[s1.length()+1][s2.length()+1]; for(int i = 0;i<= s1.length();i++){ f[i][0] = 0; } for(int j = 0;j<= s2.length();j++){ f[0][j] = 0; } for(int i = 1; i <=s1.length();i++){ for(int j = 1; j<=s2.length();j++){ if(s1[i-1] == s2[j-1]){ f[i][j] = f[i-1][j-1] +1; }else{ f[i][j] = max(f[i][j-1],f[i-1][j]); } } } int i = s1.length(), j = s2.length(); while(i>0&&j>0){ if(s1[i-1]==s2[j-1]){ result+=s1[i-1]; i--; j--; }else{ if(f[i][j-1]>f[i-1][j]){ j--; }else if(f[i][j-1]< f[i-1][j]){ i--; }else{ i--; } } } if(result.length()==0){ return "-1"; } reverse(result.begin(),result.end()); return result; } };