最长公共子序列

最长公共子序列

字符子串、字符子序列、公共子序列的概念

  1. 字符子串:指的是字符串中连续的n个字符,如abcdefg中,ab,cde,fg等都属于它的字串。
  2. 字符子序列:指的是字符串中不一定连续但先后顺序一致的n个字符,即可以去掉字符串中的部分字符,但不可改变其前后顺序。如abcdefg中,acdg,bdf属于它的子序列,而bac,dbfg则不是,因为它们与字符串的字符顺序不一致。
  3. 公共子序列:如果序列C既是序列A的子序列,同时也是序列B的子序列,则称它为序列A和序列B的公共子序列。如对序列1,3,5,4,2,6,8,7和序列 1,4,8,6,7,5 来说,序列1,8,7是它们的一个公共子序列。

题目描述
有两个字符串S1和S2,求一个最长公共子串,即求字符串S3,它同时为
S1和S2的子串,且要求它的长度最长,并确定这个长度。

/*最长公共子序列:有两个字符串S1和S2,求一个最长公共子串,即求字符串S3,它同时为
S1和S2的子串,且要求它的长度最长,并确定这个长度。
dp[i][j]表示S1中前i个字符与S2中前j个字符分别组成的两个前缀字符串的最长公共子串长度
递推条件为:
dp[0][j]=0;(0<=j<=m=strlen(s2))
dp[i][0]=0;(0<=i<=n=strlen(s1))
dp[i][j]=dp[i-1][j-1]+1;(s1[i]=s2[j])
dp[i][j]=max{dp[i-1][j],dp[i][j-1]};(s1[i]!=s2[j])*/
#include<iostream>
#include<string>
using namespace std;
int max(int a, int b){
	return a > b ? a : b;
}
int main(){
	char s1[101], s2[101];
	cin >> s1 >> s2;
	int dp[101][101];
	int l1 = strlen(s1);
	int l2 = strlen(s2);
	for (int i = 0; i <= l1; i++){
		dp[i][0] = 0;
	}
	for (int j = 0; j <= l2; j++){
		dp[0][j] = 0;
	}
	for (int i = 1; i <= l1; i++){
		for (int j = 1; j <= l2; j++){
			if (s1[i - 1] == s2[j - 1]){
				dp[i][j] = dp[i - 1][j - 1] + 1;
			}
			else{
				dp[i][j] = max(dp[i][j - 1], dp[i - 1][j]);
			}
		}
	}
	cout << dp[l1][l2] << endl;
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值