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)的要求来编写代码。 首先,我们需要...
在这个问题中,我们专注于PHP如何解决两个字符串的最长公共子串。 PHP作为一门广泛使用的服务器端脚本语言,提供了丰富的字符串和数组操作函数,这使得处理LCS问题变得相对容易。在给定的代码示例中,我们看到一种...
本文实例讲述了C语言求两个字符串的最长公共子串的方法。分享给大家供大家参考。具体实现方法如下: #include "stdio.h" #include "string.h" #include "stdlib.h" void getCommon(char str1[],char str2[],char * ...
在本题目中,任务是使用定长顺序存储结构表示串,并找出两个字符串的最长公共子串。这是一个典型的字符串处理问题,通常在计算机科学和编程领域出现。以下是对这个任务的详细解析: 首先,我们需要理解“定长顺序...
求两个字符串的最长公共子串 思想:建立一个二维数组,保存连续位相同与否的状态 ''' def getNumofCommonSubstr(str1, str2): lstr1 = len(str1) lstr2 = len(str2) record = [[0 for i in range(lstr2+1)] for j...
本主题将深入探讨如何使用C++语言来实现一个算法,该算法能够找出两个字符串中的最大公共子串。公共子串是指同时存在于两个或多个字符串中的任意非空字符序列。在本问题中,我们目标是找到最长的这样一个子串。 ...
在随意给出的2个字符串中,找出它们共同的最长的子串。 【输入】 输入文件的第一行为一个整数2,接下来有2行,每行为一个字符串,每个字符串的长度均小于255。 【输出】 输出只有一行,即:共同的最长子串,若有多个...
现在,我们要寻找两个字符串a和b中最长的公共子串。这个问题可以通过动态规划来解决。动态规划是一种利用已解决问题的解来构建更复杂问题的解的方法,它能有效地避免重复计算,提高效率。 动态规划解决方案通常涉及...
通过上述分析,我们可以看到,这段程序实现了对两个字符串的最长公共子串的有效计算。尽管其实现方式相对简单,但对于理解和学习动态规划的基本思想具有很好的参考价值。此外,在实际应用中,还可以考虑使用更高效的...
接下来,我们遍历两个字符串,如果当前字符相同,则dp[i][j] = dp[i-1][j-1] + 1,否则dp[i][j]取dp[i-1][j]和dp[i][j-1]中的较大值。最后,最长公共子串的长度就是dp数组的最大值,而子串本身可以通过回溯dp数组...
- **目标**:找出这两个字符串的最长公共子串。 #### 2. 算法步骤 该算法的核心思想是通过双重循环遍历两个字符串,逐个字符进行比较,以找到最长的匹配子串。 - **初始化**:首先设置两个指针`flag1`和`flag2`,...
在给定的压缩包文件中,我们可以看到它包含了用于开发和编译C++程序的相关文件,这表明我们将讨论如何用C++实现寻找两个字符串的最长公共子串的算法。 "最长公共子串"是指在两个或多个字符串中,长度最长的那个相同...
- 定义一个二维数组`dp`,其大小为`str1.Length+1`乘以`str2.Length+1`,用来存储两个字符串在不同位置的子串长度。 - 初始化`dp`数组,第一行和第一列的值均为0,因为没有字符可比较。 - 遍历`str1`和`str2`,...
最大公共子串是指在两个字符串中都出现的最长的连续子串。该算法的基本思想是通过构建一个二维布尔矩阵,其中矩阵的每个元素表示对应位置的字符是否相等。如果相等,则值为true,否则为false。然后,通过遍历这个...
假设我们有两个字符串S1和S2,我们可以初始化一个m×n的二维数组dp,其中m和n分别是两个字符串的长度。dp[i][j]的值表示S1的前i个字符和S2的前j个字符的最长公共子串的长度。 算法步骤如下: 1. 初始化:将dp数组...