DP的方式求解:
#include <iostream>
using namespace std;
#define M 9
#define N 11
//如果动态传进m和n的话,数组lcs赋值只能通过指针,这样太麻烦
int lcs[M][N];
/**
* 最长公共子串(LCS)
* 状态转移方程:
* f(i,j) =
0 a[i] != b[j]
f(i-1,j-1)+1 a[i] == b[j]
其中f(i,j)表示串A以a[i]结尾与串B以b[j]结尾的最长公共子串
* 优化: 这里时间和空间都是O(M*N)。
* 注意到我们自底向上求解lcs[m][n]的时候,其实是
* 逐行求解的。每行只依赖于上一行的值,所以我们其实可以利用
* “滚动数组”来优化这个DP解法的空间到O(N)。
*/
char *lcs1(char *a, char *b){
int a_len = M,b_len = N;
char *p;
int i,j;
int max = 0, end_y;
//初始化二位数组的第0列
p = a;
for(i=0;i<a_len;i++){
if(a[i] == b[0]) lcs[i][0] = 1;
else lcs[i][0] = 0;
}
//初始化二维数组的第0行
p = b;
for(j=0;j<b_len;j++){
if(b[j] == a[0]) lcs[0][j] = 1;
else lcs[0][j] = 0;
}
/**
* 核心部分:一行一行地自底向上求解
*/
for(i=1;i<a_len;i++)
for(j=1;j<b_len;j++){
//相同,则公共长度lcs[i][j]=lcs[i-1][j-1]+1
if(*(a+i) == *(b+j)){
lcs[i][j] = lcs[i-1][j-1] + 1;
//记录最大长度的横坐标
if(lcs[i][j] > max){
max = lcs[i][j];
end_y = i;
}
}
//不同,公共长度为0
else{
lcs[i][j] = 0;
}
}
//输出lcs矩阵
for(i=0;i<a_len;i++){
for(j=0;j<b_len;j++){
cout<<lcs[i][j];
}
cout<<endl;
}
//将公共子串(从a串中取)放入新空间并返回
p = (char *)malloc(sizeof(char)*(max+1));
j = 0;
for(i = end_y-max+1;i<=end_y;i++){
*(p+j) = a[i];
j++;
}
*(p+j) = '\0';
return p;
}
int main(){
char *a = "ackonpbee";
char *b = "dcaconpbexx";
cout<<"lcs:"<<lcs1(a,b)<<endl;;
return 0;
}
分享到:
相关推荐
本文实例讲述了JavaScript自定义函数实现查找两个字符串最长公共子串的方法。分享给大家供大家参考,具体如下: //查找两个字符串的最长公共子串 function findSubStr(s1,s2){ var S=sstr= ,L1=s1.length,L2=s2....
主要介绍了java实现求两个字符串最长公共子串的方法,是一道华为OJ上的一道题目,涉及Java针对字符串的遍历、转换及流程控制等技巧,需要的朋友可以参考下
主要介绍了PHP实现求两个字符串最长公共子串的方法,涉及php字符串与数组的遍历、运算、判断等相关操作技巧,需要的朋友可以参考下
本文实例讲述了C语言求两个字符串的最长公共子串的方法。分享给大家供大家参考。具体实现方法如下: #include "stdio.h" #include "string.h" #include "stdlib.h" void getCommon(char str1[],char str2[],char * ...
在随意给出的2个字符串中,找出它们共同的最长的子串。 【输入】 输入文件的第一行为一个整数2,接下来有2行,每行为一个字符串,每个字符串的长度均小于255。 【输出】 输出只有一行,即:共同的最长子串,若有多个...
求两个字符串的最长公共子串 思想:建立一个二维数组,保存连续位相同与否的状态 ''' def getNumofCommonSubstr(str1, str2): lstr1 = len(str1) lstr2 = len(str2) record = [[0 for i in range(lstr2+1)] for j...
输入两个字符串, 求它们最长公共字串的长度
LCS问题就是求两个字符串最长公共子串的问题。解法就是用一个矩阵来记录两个字符串中所有位置的两个字符之间的匹配情况,若是匹配则为1,否则为0。然后求出对角线最长的1的序列,其对应的位置就是最长匹配子串的位置...
查找两个字符串a,b中的最长的公共子串,并将结果输出
请编写一个函数,输入两个字符串,求它们的最长公共子串,并打印出最长公共子串。例如:输入两个字符串BDCABA和ABCBDAB,字符串BCBA和BDAB都是是它们的最长公共子串,则输出它们的长度4,并打印任意一个子串。 分析...
两个字符串里求最长的公共子串
c源码编写的求两个字符串的最长公共子串,采用递归算法
LCS(longest common substring)算法,即最大公共子串,它是求两个字符串最长公共子串的问题。大体解法是用一个矩阵来记录两个字符串中所有位置的两个字符之间的匹配情况,若是匹配则为1,否则为0。然后求出对角线最长...
主要介绍了Python求两个字符串最长公共子序列代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
生成一对长随机字母序列,然后确定它们之间的最长公共子串。 在以下示例中,每个原始字符串中都有 10^5 个随机元素。 基地 = 'acgt'; str1 = bases(ceil(rand(1,100000)*4)); str2 =基数(ceil(rand(1,100000)*...
请编写一个函数,输入两个字符串,求它们的最长公共子序列,并打印出最长公共子序列。 例如:输入两个字符串BDCABA和ABCBDAB,字符串BCBA和BDAB都是是它们的最长公共子序列,则输出它们的长度4,并打印任意一个子...