您的位置:首页 > 编程语言 > C语言/C++

最长公共子串的C++实现代码

2011-09-03 20:07 375 查看
算法思想

求字符串str1,str2的最长公共子串的长度。

定义二元函数函数f(m,n):分别以str1[m],str2
结尾的连续公共子串的长度

而对于f(m+1,n+1) 有以下两种情况

1.str1[m+1] != str2[n+1],则有f(m+1,n+1) =0

2.str1[m+1] == str2[n+1],则有f(m+1,n+1) = f(m,n) + 1

另外f(0,j) = 0(j>=0)

f(j,0) = 0 (j>=0)

按照上面这个公式,我们用容易写出这个算法的实现

#include <iostream>

#include <vector>

using namespace std;

void MaxSameSub(const vector<int> &data1,const vector<int> &data2)

{

int num1=data1.size();

int num2=data2.size();

//记录以data1的第i个元素和data2的第j个元素结尾的两个子串的公共子序列长

//这里的i,j均是从1开始

vector<vector<int> > arrayLong(num1+1,vector<int>(num2+1,0));

for(int i=0;i<=num1;i++)

{

arrayLong[i][0]=0;

}

for(int j=0;j<=num2;j++)

{

arrayLong[0][j]=0;

}

for(i=1;i<=num1;i++)

{

for(j=1;j<=num2;j++)

{

//第i个元素就是data1[i-1]

//第j个元素就是data2[j-1]

if(data1[i-1]==data2[j-1])

{

arrayLong[i][j]=arrayLong[i-1][j-1]+1;

}

else

{

arrayLong[i][j]=0;

}

}

}

//最长子串的最后一个元素在两个数组中的下标分别放到resultX,resultY

//最长子串长度为max

int resultX,resultY;

int max=0;

for(i=1;i<=num1;i++)

{

for(j=1;j<=num2;j++)

{

if(max<arrayLong[i][j])

{

max=arrayLong[i][j];

resultX=i;

resultY=j;

}

}

}

cout<<"the long of the sequence:"<<max<<endl;

cout<<"the sequence:"<<endl;

for(i=resultX-max;i<resultX;i++)

cout<<data1[i]<<" ";

cout<<endl;

}

int main()

{

cout<<"input the size of the 2 array:"<<endl;

int num1,num2;

cin>>num1>>num2;

vector<int> arr1(num1,0);

vector<int> arr2(num2,0);

cout<<"input array1:"<<endl;

for(int i=0;i<num1;i++)

cin>>arr1[i];

cout<<"input array2:"<<endl;

for(i=0;i<num2;i++)

cin>>arr2[i];

MaxSameSub(arr1,arr2);

return 1;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: