学习目标
熟悉KMP算法的操作,之前写过KMP ,长时间不看忘了,重温下
过程
- 28. 实现 strStr()
class Solution {
public:
int strStr(string haystack, string needle) {
//使用KMP 算法
int pat_size=needle.size();
int src_size=haystack.size();
int *next=(int *)malloc(sizeof(int)*pat_size);
kmp_init(needle,next);
int i,j;
for (i=0,j=0;i<src_size&&j<pat_size;) {
if(haystack[i]==needle[j])
{
i++;
j++;
}
else
{
j=next[j];
if(j==-1) {//需要i往后移动
j=0;
i++;
}
}
}
if(j==pat_size)
{
return (i-pat_size);
}
else
{
return -1;
}
}
void kmp_init(string p, int *next) {
int size=p.size();
if(size<2) //如果只有1个
{
next[0]=-1;
return ;
}
next[0] = -1; //这个是固定的
next[1] = 0;
int k=1;
int i=1;
while(i<(size-1))
{
k=i;
while(1)
{
if(p[i]==p[next[k]])
{
next[++i]=next[k]+1;
break;
}
else //不相等的情况
{
k=next[k];
if(next[k]==-1)
{
next[++i]=0;
break; //直接退出
}
}
}
}
}
};
- 459.重复的子字符串
勉强做出来了,但速度不行,应该找规则。
class Solution {
public:
bool repeatedSubstringPattern(string s) {
int size=s.size();
if(size==0){
return false;
}
if(size==1){
return false;
}
char temp_char[size-1];
for(int i=1;i<size;i++){
temp_char[i-1]=s[i];
}
int i=0;
int pattern_num=0;;
while(pattern_num<(size-1)){
int temp_pattern_num=pattern_num;
i=0;
while(i<size){
if(s[i++]!=temp_char[temp_pattern_num++]){
pattern_num++;
i=0;
break;
}
if(temp_pattern_num==(size-1)){
temp_pattern_num=pattern_num;
}
}
if(i==size){
return true;
}
}
return false;
}
};
结论
KMP 算法还是比较麻烦,后面需要加深理解!