求一個串中出現的第一個最長重複子串。
輸入串:36123459836121234569
求最長重複子串:
原串:36123459836121234569
最長重複子串:12345web
關於這個問題有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); }
補充的稍微完整主函數以下:svg
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); }