// 最长公共子串.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;
}
最长公共子串
最新推荐文章于 2025-05-24 12:00:00 发布