算法导论中如何求两个字符串的最长公共子序列

#include<iostream>
#include<string>
using namespace std;
const int max_length=10;
void print(int b[max_length][max_length],string X,int i,int j);
void LCS(string X,string Y,int b[max_length][max_length],int m,int n )
{
	int **c=new int*[m+1];
	for(int i=0;i<m+1;++i)
		c[i]=new int[n+1];
	for(int i=0;i<n+1;++i)
		c[0][i]=0;
	for(int i=0;i<m+1;++i)
		c[i][0]=0;
	for(int i=1;i<m+1;++i)
	{
		for(int j=1;j<n+1;++j)
		{
			if(X[i]==Y[j])
			{
				c[i][j]=c[i-1][j-1]+1;
				b[i][j]=1;
			}
			else if(c[i][j-1]>=c[i-1][j])
			{
				c[i][j]=c[i][j-1];
				b[i][j]=2;
			}
			else
			{
				c[i][j]=c[i-1][j];
				b[i][j]=3;
			}
		}
	}

	//下面是进行结果的输出
	print(b,X,m,n);

}

void print(int b[max_length][max_length],string X,int i,int j)
{
	if(0==i||0==j)
		return ;
	if(b[i][j]==1)
	{
		print(b,X,i-1,j-1);
		cout<<X[i]<<" ";
	}
	else if(b[i][j]==3)
	{
		print(b,X,i-1,j);
	}
	else
	{
		print(b,X,i,j-1);
	}

}
int main()
{
	int b[max_length][max_length]={0};
	string X("0abcbdab");
	string Y("0bdcaba");
	 LCS( X, Y, b,7,6);
	system("pause");
	return 0;
}

时间: 2024-11-05 12:13:02

算法导论中如何求两个字符串的最长公共子序列的相关文章

动态规划之----求两个字符串的最长公共子序列

package DongtaiGuihua; /** * Created by hunk on 2015/9/13. */public class LongestCommonSubstring { public static void main(String[] args){ String str1="BDCABA"; String str2="ABCBDAB"; System.out.println(findMaxCommonSubstring(str1,str2

c++求两个字符串的最长公共子序列and子串

https://blog.csdn.net/ggdhs/article/details/90713154 #include <iostream> using namespace std; int main() { char str1[] = "helloworld"; char str2[] = "loop"; int arr[11][5] = {0}; for(uint32_t i=1; i<11;i++) { cout << str

求两个字符串的最长公共子串——Java实现

要求:求两个字符串的最长公共子串,如"abcdefg"和"adefgwgeweg"的最长公共子串为"defg"(子串必须是连续的) public class Main03{ // 求解两个字符号的最长公共子串 public static String maxSubstring(String strOne, String strTwo){ // 参数检查 if(strOne==null || strTwo == null){ return null

求解两个字符串的最长公共子序列

一,问题描述 给定两个字符串,求解这两个字符串的最长公共子序列(Longest Common Sequence).比如字符串1:BDCABA:字符串2:ABCBDAB 则这两个字符串的最长公共子序列长度为4,最长公共子序列是:BCBA 二,算法求解 这是一个动态规划的题目.对于可用动态规划求解的问题,一般有两个特征:①最优子结构:②重叠子问题 ①最优子结构 设 X=(x1,x2,.....xn) 和 Y={y1,y2,.....ym} 是两个序列,将 X 和 Y 的最长公共子序列记为LCS(X,

求三个字符串的最长公共子序列LCS(A,B,C)

LCS(A,B,C)!=LCS(A,LCS(B,C)) 反例: abcd abcde abced LCS(B,C)求出来可能是abce或者abcd dp[i][j][k]表示A[0...i],B[0...j],C[0...k]的LCS 转移方程: if (a[i]==b[j]&&b[j]==c[k]) dp[i][j][k]=dp[i-1][j-1][k-1]+1; else dp[i][j][k]=max(max(dp[i][j][k], dp[i-1][j][k]), max(dp[i

动态规划求两个序列的最长公共子序列

摘录:http://blog.chinaunix.net/uid-26548237-id-3374211.html 1.序列str1和序列str2 ·长度分别为m和n: ·创建1个二维数组L[m.n]: ·初始化L数组内容为0 ·m和n分别从0开始,m++,n++循环: - 如果str1[m] == str2[n],则L[m,n] = L[m - 1, n -1] + 1: - 如果str1[m] != str2[n],则L[m,n] = max{L[m,n - 1],L[m - 1, n]}

[URAL-1517][求两个字符串的最长公共子串]

Freedom of Choice URAL - 1517 Background Before Albanian people could bear with the freedom of speech (this story is fully described in the problem "Freedom of speech"), another freedom - the freedom of choice - came down on them. In the near fu

【java】求两个字符串的最长公共子串

这个是华为OJ上的一道题目.首先,如果我们用java写代码,华为OJ有以下三条规则需遵守,否则编译无法通过或者用例无法通过,规则如下: (1)一定不可以有包名: (2)主类名只能为Main: (3)不可以输出与结果无关的信息. 好了,按照以上规则,我们写出来的代码如下(此代码不是最优的,只是用来记录华为OJ上java代码的书写规则): import java.util.Scanner; public class Main { public static void main(String[] ar

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

public static String findLongestOfTheSame(String s1,String s2) { char[] c1=s1.toCharArray(); char[] c2=s2.toCharArray(); int l1=c1.length; int l2=c2.length; int count=0,maxLength=0,start=0,end=0; boolean hasTheSame=false; for(int i=0;i<l1;i++) { coun