数据结构和算法 level
获赞
5556
粉丝
480
关注
49
看过 TA
765
门头沟学院
2013
前端工程师
IP属地:上海
专注算法讲解,关注我一起学习算法。
私信
关注
04-18 17:53
已编辑
门头沟学院 前端工程师
动态规划解决 注意这题求的是最长公共子串,不是最长公共子序列,子序列可以是不连续的,但子串一定是连续的。 定义dp[i][j]表示字符串str1中第i个字符和str2种第j个字符为最后一个元素所构成的最长公共子串。如果要求dp[i][j],也就是str1的第i个字符和str2的第j个字符为最后一个元素所构成的最长公共子串,我们首先需要判断这两个字符是否相等。   如果不相等,那么他们就不能构成公共子串,也就是 dp[i][j]=0;   如果相等,我们还需要计算前面相等字符的个数,其实就是dp[i-1][j-1],所以 dp[i][j]=dp[i-1][j-1]+1;    有了递推公式,代码...
牛客66419930...:不确定源代码是什么版本的c++ 直接拷过来没法用 所以我改了一下下 class Solution { public: /** * longest common substring * @param str1 string字符串 the string * @param str2 string字符串 the string * @return string字符串 */ string LCS(string str1, string str2) { // write code here int maxLenth = 0;//记录最长公共子串的长度 //记录最长公共子串最后一个元素在字符串str1中的位置 int maxLastIndex = 0; int *dp = new int[str2.length() + 1]; for (int i = 0; i < str1.length(); i++) { //注意这里是倒叙 for (int j = str2.length() - 1; j >= 0; j--) { //递推公式,两个字符相等的情况 if (str1.at(i) == str2.at(j)) { dp[j + 1] = dp[j] + 1; //如果遇到了更长的子串,要更新,记录最长子串的长度, //以及最长子串最后一个元素的位置 if (dp[j + 1] > maxLenth) { maxLenth = dp[j + 1]; maxLastIndex = i + 1; } } else { //递推公式,两个字符不相等的情况 dp[j + 1] = 0; } } } //最字符串进行截取,substring(a,b)中a和b分别表示截取的开始和结束位置 return str1.substr(maxLastIndex - maxLenth, maxLenth); } };
数据结构和算法
0 点赞 评论 收藏
分享

创作者周榜

更多
关注他的用户也关注了:
牛客网
牛客网在线编程
牛客网题解
牛客企业服务