資料結構——求一個串中出現的第一個最長重複子串
阿新 • • 發佈:2018-12-03
求一個串中出現的第一個最長重複子串。
輸入串:36123459836121234569
求最長重複子串:
原串:36123459836121234569
最長重複子串:12345
關於這個問題有KMP優化,暫時還沒掌握
下面這個演算法在輸入輸出方面還有待優化
#include <stdio.h>
#define MaxSize 100
typedef struct {
char data[MaxSize]; //串中字元
int length; //串長
} SqString; //宣告順序串型別
void init(SqString &s)
{
s.length= 0;
}
int insert(SqString &s,char a)
{
if(s.length>=MaxSize)
return 0;//溢位返回
s.data[s.length++]=a;
}
void print(SqString s)
{
for(int i=0;i<s.length;i++)
printf("%c",s.data[i]);
s.data[s.length]='\0';//這個語句也可以寫在主函式裡,那樣的話只用呼叫一次
}
void Longest_substrings(SqString s,SqString &sub)
{
int i,j,k,length,loc=0;
for(i=0;i<s.length;i++)
{
for(j=i+1;j<s.length;)
{
if(s.data[i]==s.data[j])
{
length=1;
for(k=1;s.data[i+k]==s.data[j+k];k++)
length++;
if(length>sub.length)
//這裡取不取等號決定了是否為第一個最長重複子串
{
sub.length=length;
loc=i;
}
j+ =length;
}
else j++;
}
}
for(i=loc,j=0;i<sub.length+loc;i++,j++)
{
sub.data[j]=s.data[i];
}
}
int main()
{
SqString str1,sub1;
init(str1);
init(sub1);
char a[100];
gets(a);
for(int i=0;a[i]!='\0';i++)
{
insert(str1,a[i]);
}
Longest_substrings(str1,sub1);
print(sub1);
}
補充的稍微完整主函式如下:
int main()
{
char a[100];
SqString str1,sub1;
init(str1); init(sub1);
printf("輸入串:");
//gets(a);
scanf("%s",a);
for(int i=0;a[i]!='\0';i++)
{
insert(str1,a[i]);
}
printf("求最長重複子串:\n");
printf("原串:");
//puts(str1.data);
printf("%s",str1.data);
Longest_substrings(str1,sub1);
printf("\n最長重複子串:");
print(sub1);
}