阿里2015届校招在线笔试题
给定一个query和一个text,均由小写字母组成。要求在text中找出以同样的顺序连续出现在query中的最长连续字母序列的长度。例如, query为“acbac”,text为“acaccbabb”,那么text中的“cba”为最长的连续出现在query中的字母序列,因此,返回结果应该为其长度3。请注意程序效率。
//Zhou He 2014.9.15
#include <iostream>
#include <string>
using namespace std;
void get_next(string s,int *next)
{
int len=s.length();
int i=0,j=0;
next[0]=0;
//next[1]=0;
while(i<(len-1))
{
if(j==0||s[i]==s[j-1])
{
++i;
++j;
if(s[i]!=s[j-1])
next[i]=j;
else
next[i]=next[j];
}
else
j=next[j-1];
}
}
int KMP(string s,string t,int p)
{
int i=p;
int j=0;
int k;
int len_s=s.length();
int len_t=t.length() ;
int next[100];
get_next(t,next);
while(i<len_s&&j<=len_t)
{
if (j==0||s[i]==t[j-1])
{
++i;
++j;
}
else
j=next[j-1];
}
if (j>len_t)
{
k=1;
}
else
k=-1;
return k;
}
int main()
{
string S="acaccbabbacba";
string T="acbac";
//string S = "aaac";
//string T = "aac";
int n,i=5;
string t;
while(i>0)
{
for (int j=0;j+i<=T.length();j++)
{
t=T.substr(j,i);
n=KMP(S,t,0);
if(n==1)
{
cout<<t<<" "<<i<<endl;
return 0;
}
}
i--;
}
cout<<"find nothing"<<endl;
return 0;
}