【发布时间】:2021-02-07 04:36:44
【问题描述】:
这是问题陈述
给定两个字符串 s1 和 s2,返回它们的最长公共子序列的长度。
字符串的子序列是从原始字符串生成的新字符串,其中删除了一些字符(可以是无),而不改变剩余字符的相对顺序。 (例如,“ace”是“abcde”的子序列,而“aec”不是)。两个字符串的公共子序列是两个字符串共有的子序列。
如果没有公共子序列,则返回0。
这是我的代码
class Solution {
public:
int dp[1001][1001];
int lcs(string s1,string s2,int n,int m){
if (n==0 || m == 0)
return 0;
if(dp[n][m]!=-1)
return dp[n][m];
if (s1[n-1] == s2[m-1])
{
return dp[n][m]= 1 + lcs(s1,s2,n-1,m-1);
}
else
{
return dp[n][m]= max(lcs(s1,s2,n-1,m), lcs(s1,s2,n,m-1));
}
return dp[n][m];
}
int longestCommonSubsequence(string s1, string s2) {
memset(dp,-1,1001*1001*sizeof(int));
return lcs(s1,s2, s1.size(), s2.size());
}
};
谢谢
【问题讨论】:
-
所有字符串都需要传值吗?
-
顺便说一句,你确定这是正确的算法吗?当传递
"abcde"和"ba"时,函数返回2。按问题语句不应该是1吗? -
我认为 TLE 是指超出时间限制,但世界不会从 TLA 的无休止扩散中获得无限收益。
-
return dp[n][m];永远不会在lcs函数结束时执行。 -
@Bob__ 它不是最长的公共子字符串,请参阅en.wikipedia.org/wiki/Longest_common_subsequence_problem
标签: c++ recursion memoization cp