面试题-求一个串包括还有一个串的最大子串长度的解法
题目:求串text中所包括串test中的最大子串。比方text="abcgfdd",test="hhmcgfp",则最大子串为cgf。长度为3
我的解法例如以下:
从大到小分别求出text的子串。用kmp比較是否在text中,若在就是最大子串。返回长度。代码例如以下:
int maxsublength(string s1,string s2) { int ls1=s1.length(); int ls2=s2.length(); int maxsublen=ls1; if(ls2<ls1) maxsublen=ls2; while(maxsublen>0) { for(i=0;i+maxsublen<=ls1;i++) { if(kmp(s2,s1.substr(i,maxsublen))!=0)//是否是子串。是子串则为最大子串 return maxsublen; } --maxsublen; } return 0; } void getnext(string *t,int next[]) { int j,k; j=0;k=-1;next[0]=-1; while(j<t->length()) { if(k==-1||t[j]==t[k])//相等或者是第一个,则加1 { j++;k++;next[j]=k;}//next Else k=next[k]; }//while } int KMPindex(string *s,string *t) { //int stp=t->length(); int next[max]; int i,j; getnext(t,next); i=0;j=0; while(i<s->length()&&j<t->length()) if(j==-1||s[i]==t[j])//相应字符同样,指针后移一个位置 {i++;j++;} else //若不成功从子串的t[next[j]]開始匹配 j=next[j];//while if(j>=t->length()) return i-t->length()+1;//匹配成功返回第一个字符出现的位置 else return 0; //匹配不成功,返回零 }