C++实现最长公共子序列和最长公共子串
2018-03-03 18:08
435 查看
题目:有两个字符串(可能包含空格),找出其中最长的公共连续子串,并输出其长度。 输入描述:输入为两行字符串(可能包含空格),长度均小于等于50。输出描述: 输出为一个整数,表示最长公共连续子串的长度。输入例子:abcdeabgde输出例子:2
两种参考思路如下:(1)假设两个字符串str1和str2的长度分别为m和n,构建一个矩阵(即二维数组)M[m],初始值都设为0,如果字符串str1中
第i个字符str[i-1](下标从零开始)与字符串str2中第j个字符串str[j-1]相等,则将matric[i][j]设为1。最后统计矩阵M中对角线最大的连续1的个数,
即为两字符串最长公共子串。注:如不好理解,可以画图辅助。
参考代码如下:#include <iostream>#include <string>using namespace std;int main() { char str1[51],str2[51]; int matric[51][51]={0}; int MaxLen=0; gets(str1); //cin.getline(str1,51); gets(str2); for(int i=0;str1[i]!='\0';i++) //如果两个位置的元素相等,矩阵值为1 { for(int j=0;str2[j]!='\0';j++) { if(str1[i]==str2[j]) matric[i][j]=1; } } for(int i=0;str1[i]!='\0';i++) //依次找对角线最大连续1的个数 { for(int j=0;str2[j]!='\0';j++) { int m=i; int n=j; int len=0; while(matric[m++][n++]==1) len++; if(MaxLen<len) MaxLen=len; } } cout<<MaxLen<<endl; }(2)运用动态规划的思想。解题思路:这题其实是动态规划的变形经典题型,应用动态规划的思想,创建一个二维数组dp,其中dp[i][j],表示取到s1[i]和取到s2[j]时的最大连续子串长度。如果s1[i]等于s2[j],则dp[i-1][j-1]等于取到s1[i-1]和取到s2[j-1]时的最大连续子串长度加1,即dp[i][j]=dp[i-1][j-1]+1。相关文章推荐
- 利用C++实现最长公共子序列与最长公共子串
- C++实现最长公共子序列和最长公共子串
- C++实现最长公共子序列和最长公共子串
- 最长公共子串的C++实现代码
- Python最长公共子串和最长公共子序列的实现
- 最长公共子串和最长公共子序列之Python实现
- 详解Python最长公共子串和最长公共子序列的实现
- 最长公共字符子串C++实现
- 算法导论第十五章---最长公共子串LCS代码实现
- 最长公共子串 最长公共子序列 最长递增子序列
- 最长公共子串--后缀数组实现
- 动态划归:最长公共子串和最长公共子序列--LCS
- 最大子序列、最长递增子序列、最长公共子串、最长公共子序列、字符串编辑距离
- 最大子序列、最长递增子序列、最长公共子串、最长公共子序列、字符串编辑距离
- 最长公共子序列和最长公共子串
- LCS 最长公共子串算法实现 C#
- 动态规划 - 最长公共子序列 - 最长公共子串 - 最长不重复子串 - 最长递增子序列 - 最长回文子串
- 最大子序列、最长递增子序列、最长公共子串、最长公共子序列、
- 最大子数组和、最长递增子序列、最长公共子串、最长公共子序列、字符串编辑距离
- 最长公共子序列问题 和 最长公共子串问题