【算法】计算最长的公共连续子串的长度(C++源码)
- 一、任务描述:
- 二、步骤描述
- 三、运行结果截图
- 四、源代码(C++)
一、任务描述:
给定两个字符串(可能包含空格),请设计算法找出其中最长的公共连续子串的长度,例如,字符串“abcde”和“abgde”的最长公共连续字串为“ab”,其长度为2。
二、步骤描述
定义一个getsame函数,内包含三个参数,三个字符指针,第一个为字符串“abcde”,第二个为字符串“abgde”,第三个为两字符串的共有部分,定义一个count数组,全部置为零,从后往前比较字符是否相等,相等了往前加一,与maxlen比较,输出最大的联系子串,并记录下标,输出。
三、运行结果截图
四、源代码(C++)
#include <iostream>
#include <cstring>
using namespace std;
void getsame(const char* s1,const char* s2,char*& s)
{
const int l1=(int)strlen(s1);
const int l2=(int)strlen(s2);
int* count=new int[l2+1];
for(int i=0;i<=l2;i++)
{
count[i]=0;
}
int maxlen=0;
int end=0;
for(int i=0;i<l1;i++)
{
for(int j=l2;j>0;j--)
{
if(s2[j-1]==s1[i])
{
count[j]=count[j-1]+1;
if(count[j]>maxlen)
{
maxlen=count[j];
end=j;
}
}
else
{
count[j]=0;
}
}
}
if(maxlen==0)
{
delete[] count;
return;
}
s=new char[maxlen];
for(int i=end-maxlen;i<end;i++)
{
s[i-end+maxlen]=s2[i];
cout<<s2[i];
}
cout<<endl;
delete[] count;
}
int main()
{
const char* s1="abcde";
const char* s2="abgde";
char* s;
cout<<"s1 : "<<s1<<endl;
cout<<"s2 : "<<s2<<endl;
cout<<"The same strings :";
getsame(s1,s2,s);
cout<<"The number of same strings : ";
cout<<strlen(s);
}