`
jiq408694711
  • 浏览: 36610 次
  • 性别: Icon_minigender_1
  • 来自: 南京
文章分类
社区版块
存档分类
最新评论

两个字符串的最长公共子串

 
阅读更多

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自定义函数实现查找两个字符串最长公共子串的方法

    本文实例讲述了JavaScript自定义函数实现查找两个字符串最长公共子串的方法。分享给大家供大家参考,具体如下: //查找两个字符串的最长公共子串 function findSubStr(s1,s2){ var S=sstr= ,L1=s1.length,L2=s2....

    java实现求两个字符串最长公共子串的方法

    在编程领域,求解两个字符串的最长公共子串是一个经典问题,主要应用于文本处理、比较和搜索算法。这里我们将深入探讨如何使用Java实现这一方法,同时结合华为在线判题平台(OJ)的要求来编写代码。 首先,我们需要...

    PHP实现求两个字符串最长公共子串的方法示例

    在这个问题中,我们专注于PHP如何解决两个字符串的最长公共子串。 PHP作为一门广泛使用的服务器端脚本语言,提供了丰富的字符串和数组操作函数,这使得处理LCS问题变得相对容易。在给定的代码示例中,我们看到一种...

    C语言求两个字符串的最长公共子串

    本文实例讲述了C语言求两个字符串的最长公共子串的方法。分享给大家供大家参考。具体实现方法如下: #include "stdio.h" #include "string.h" #include "stdlib.h" void getCommon(char str1[],char str2[],char * ...

    用定长顺序存储结构表示串,求两个串的全部最长公共子串

    在本题目中,任务是使用定长顺序存储结构表示串,并找出两个字符串的最长公共子串。这是一个典型的字符串处理问题,通常在计算机科学和编程领域出现。以下是对这个任务的详细解析: 首先,我们需要理解“定长顺序...

    python实现求两个字符串的最长公共子串方法

    求两个字符串的最长公共子串 思想:建立一个二维数组,保存连续位相同与否的状态 ''' def getNumofCommonSubstr(str1, str2): lstr1 = len(str1) lstr2 = len(str2) record = [[0 for i in range(lstr2+1)] for j...

    C++实现找出两个字符串中最大的公共子串

    本主题将深入探讨如何使用C++语言来实现一个算法,该算法能够找出两个字符串中的最大公共子串。公共子串是指同时存在于两个或多个字符串中的任意非空字符序列。在本问题中,我们目标是找到最长的这样一个子串。 ...

    在随意给出的2个字符串中,找出它们共同的最长的子串

    在随意给出的2个字符串中,找出它们共同的最长的子串。 【输入】 输入文件的第一行为一个整数2,接下来有2行,每行为一个字符串,每个字符串的长度均小于255。 【输出】 输出只有一行,即:共同的最长子串,若有多个...

    查找最长公共子串

    现在,我们要寻找两个字符串a和b中最长的公共子串。这个问题可以通过动态规划来解决。动态规划是一种利用已解决问题的解来构建更复杂问题的解的方法,它能有效地避免重复计算,提高效率。 动态规划解决方案通常涉及...

    求两个字符串的最长公共字串

    通过上述分析,我们可以看到,这段程序实现了对两个字符串的最长公共子串的有效计算。尽管其实现方式相对简单,但对于理解和学习动态规划的基本思想具有很好的参考价值。此外,在实际应用中,还可以考虑使用更高效的...

    最长公共子串MFC实现

    接下来,我们遍历两个字符串,如果当前字符相同,则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`,...

    新建 WinRAR 压缩文件_最长公共子串_

    在给定的压缩包文件中,我们可以看到它包含了用于开发和编译C++程序的相关文件,这表明我们将讨论如何用C++实现寻找两个字符串的最长公共子串的算法。 "最长公共子串"是指在两个或多个字符串中,长度最长的那个相同...

    C#最长公共子串(连续)算法(自创)

    - 定义一个二维数组`dp`,其大小为`str1.Length+1`乘以`str2.Length+1`,用来存储两个字符串在不同位置的子串长度。 - 初始化`dp`数组,第一行和第一列的值均为0,因为没有字符可比较。 - 遍历`str1`和`str2`,...

    java实现字符串匹配求两个字符串的最大公共子串

    最大公共子串是指在两个字符串中都出现的最长的连续子串。该算法的基本思想是通过构建一个二维布尔矩阵,其中矩阵的每个元素表示对应位置的字符是否相等。如果相等,则值为true,否则为false。然后,通过遍历这个...

    获取最长公共子串

    假设我们有两个字符串S1和S2,我们可以初始化一个m×n的二维数组dp,其中m和n分别是两个字符串的长度。dp[i][j]的值表示S1的前i个字符和S2的前j个字符的最长公共子串的长度。 算法步骤如下: 1. 初始化:将dp数组...

Global site tag (gtag.js) - Google Analytics