最长公共子串

本文介绍了一种使用动态规划方法来寻找两个字符串之间的最长公共子串的算法实现。该算法通过构建一个一维数组来存储匹配状态,并通过迭代更新数组以找到最大长度的公共子串及其位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

// 最长公共子串.cpp : 定义控制台应用程序的入口点。
//
/*用动态规划求解最长公共子串,建立01的二维矩阵表示子串是否相似,找相邻斜对角线的最大长度,每次找下一行的时候更新二维数组,
并且令当前值为其上一行斜对角线的值加一。由于二维矩阵不断的每行每行的更新,所以可以用一维数组代替。用变量保存已经求得的
最大的子串长度,和最后一个子串出现的位置。此方法的时间复杂度为O(m*n),m,n分别为两个串的长度*/
#include "stdafx.h"
#include <iostream>
using namespace std;
#define M 6
#define N 7
//char *s = "abcdefg";
char *s = "abacbc";
//char *t = "abdbcdfg";
char *t = "bacbacb";

int _tmain(int argc, _TCHAR* argv[])
{
	//int k = M>N ? N : M;//k为M,N中的小的,建立k维数组
	int length[M];
	int maxLength=0;
	int maxPos_x,maxPos_y;
	for (int i=0;i<M;i++)
	{
		length[i] = 0;
	}
	for (int i=0;i<N;i++)//t
	{
		//for (int j=0;j<M;j++)//s 错误的
		for (int j=M-1;j>=0;j--)//注意 这里j要从大到小,因为j用到原来的j-1元素,若从小到大,那么j-1元素先被设置,j用的就是刚刚被设置的j-1元素,这是错误的。原因是原来的j-1内容被覆盖了。
		{
			if (t[i]==s[j])
			{
				if (j>0)
					length[j] = length[j-1] + 1;
				else
					length[j] = 1;
				if (length[j]>maxLength)
				{
					maxLength = length[j];
					maxPos_x = i;
					maxPos_y = j;
				}
			}
			else
				length[j] = 0;
		}
	}
	cout<<" max common length is "<<maxLength<<"      posX is "<<maxPos_x<<"     posY is "<<maxPos_y<<endl;
	system("pause");
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值