5
社区成员
发帖
与我相关
我的任务
分享最长公共子串(Longest CommonSubstring)和最长公共子序列(LongestCommon Subsequence, LCS)的区别:子串(Substring)是串的一个连续的部分,子序列(Subsequence)则是从不改变序列的顺序,而从序列中去掉任意的元素而获得的新序列;更简略地说,前者(子串)的字符的位置必须连续,后者(子序列LCS)则不必。
#include<iostream>
#include<string.h>
#define N 10000
using namespace std;
//将全部子序列转化成字符串并存储在字符串数组中
void strSubsequence(int *strlen,int n,char c[],string strs[]){
string str;
int slen=0,si=0;
for(int h=0;h<n;h++){//子序列首
for(int r=h;r<n;r++){//子序列尾
for(int i=h;i<r+1;i++){//输出子序列
str+=c[i];
}
//cout<<str<<endl;
strs[si++]=str;
slen++;
str="";//清空上一个子串
}
}
for(int i=0;i<slen;i++){
// cout<<strs[i]<<",";
}
*strlen=slen;
}
int main(){
int n=0;
cout<<"输入序列1的个数:";
cin>>n;
char *c = new char[n];
cout<<"输入序列1元素:";
for(int i=0;i<n;i++){
cin>>c[i];
}
string strs[N];
int strlen=0;
strSubsequence(&strlen,n,c,strs);
//输入序列2
int n2=0;
cout<<"输入序列2的个数:";
cin>>n2;
char *cc = new char[n2];
cout<<"输入序列2元素:";
for(int i=0;i<n2;i++){
cin>>cc[i];
}
//比较
string str="",maxstr="";
int maxlength=-10;
for(int h=0;h<n2;h++){//子序列首
for(int r=h;r<n2;r++){//子序列尾
for(int i=h;i<r+1;i++){//输出子序列
str+=cc[i];
}
//cout<<str<<endl;
for(int si=0;si<strlen;si++){
if(str==strs[si]){
int templen =(strs[si]).length();
if(templen>maxlength){
maxlength=templen;
string temps = str;
maxstr=temps;
}
cout<<strs[si]<<" "<<"长度:"<<(strs[si]).length()<<endl;
}
}
str="";//清空上一个子串
}
}
cout<<"最长共有子序列:"<<maxstr<<"长度为:"<<maxlength;
return 0;
}
输出样例:
