###### [LeetCode-28] Implement strStr（KMP 字符串匹配）

Implement strStr().

Returns the index of the first occurrence of needle in haystack, or -1 if needle is not part of haystack.

Subscribe to see which companies asked this question

【解题思路】

void getNext(char *strSub,int *strSubnext)
{
if(!strSub||!strSubnext)
return;

int strSubLen = strlen(strSub);

int i = 0;/*后缀字符的当前位置*/
int j = -1;/*前缀字符的当前位置*/

strSubnext[0] = -1;

while(i<(strSubLen-1)) {
if(j==-1||strSub[i]==strSub[j]) { /*后缀字符和前缀字符相等时*/
i++;
j++;
strSubnext[i] = j;/*前缀字符当前对应值是在后缀位置+1*/
} else {
j = strSubnext[j];/*回溯回去，回到后缀位置*/
}
}
}

int strStr(char* haystack, char* needle)
{
if(!haystack||!needle) {
return -1;
}

int srcStringLen = strlen(haystack);
int keyStringLen = strlen(needle);

if(srcStringLen<keyStringLen)
return -1;

if(srcStringLen==0||keyStringLen==0)
return 0;

int *strSubnext = (int *)malloc(sizeof(int)*(keyStringLen));

int i = 0;
int j = 0;

getNext(needle,strSubnext);

while(i<srcStringLen&&j<keyStringLen) {
if(j==-1||haystack[i]==needle[j]) {
++i;
++j;
} else {
j = strSubnext[j];
}

if(j==keyStringLen) {
free(strSubnext);
return (i-keyStringLen);/*返回当前位置*/
}
}

return -1; /*没找到*/
}

// LeetCode28-Implement strStr.cpp : 定义控制台应用程序的入口点。

//LeetCode28-Implement strStr
//Written by ZP1015
//2015.11.20
#include "stdafx.h"

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include<time.h>

void getNext(char *strSub,int *strSubnext)
{
if(!strSub||!strSubnext)
return;

int strSubLen = strlen(strSub);

int i = 0;/*后缀字符的当前位置*/
int j = -1;/*前缀字符的当前位置*/

strSubnext[0] = -1;

while(i<(strSubLen-1)) {
if(j==-1||strSub[i]==strSub[j]) { /*后缀字符和前缀字符相等时*/
i++;
j++;
strSubnext[i] = j;/*前缀字符当前对应值是在后缀位置+1*/
} else {
j = strSubnext[j];/*回溯回去，回到后缀位置*/
}
}
}

int strStr(char* haystack, char* needle)
{
if(!haystack||!needle) {
return -1;
}

int srcStringLen = strlen(haystack);
int keyStringLen = strlen(needle);

if(srcStringLen<keyStringLen)
return -1;

if(srcStringLen==0||keyStringLen==0)
return 0;

int *strSubnext = (int *)malloc(sizeof(int)*(keyStringLen));

int i = 0;
int j = 0;

getNext(needle,strSubnext);

while(i<srcStringLen&&j<keyStringLen) {
if(j==-1||haystack[i]==needle[j]) {
++i;
++j;
} else {
j = strSubnext[j];
}

if(j==keyStringLen) {
free(strSubnext);
return (i-keyStringLen);/*返回当前位置*/
}
}

return -1; /*没找到*/
}

int main()
{
clock_t start,stop;
double duringtime;
start = clock();
char *srcString ="aaaab";
char *keyString = "b";

int result = strStr(srcString, keyString);
printf("%d\n",result);
stop = clock();
duringtime=(double)(stop-start)/CLOCKS_PER_SEC;
printf("%f\n",duringtime);

getchar();
return 0;
}



#### LeetCode 之 Implement strStr() — C 实现

2015-06-11 11:25:54

#### [LeetCode]KMP——字符串匹配

2016-04-24 19:53:06

#### LeetCode-难题集之Implement strStr()与KMP算法

2016-08-16 11:11:16

#### [Leetcode] Implement strStr()与 KMP算法

2014-07-07 23:32:06

#### LeetCode Implement strStr() 暴力法， KMP法， Boyer-Moore简易版法

2013-12-01 08:00:59

#### leetcode -- Implement strStr() -- KMP难理解，但考得不多，知道就好

2015-12-08 20:35:06

#### [Leetcode P28] Implement strStr()（KMP算法）

2017-08-07 22:49:29

#### LeetCode-28-Implement strStr() KMP模板题

2017-09-11 17:57:47

#### LeetCode 27. Implement strStr() (KMP算法-模式串匹配)

2014-06-17 02:35:19

#### [LeetCode]28 实现子字符串匹配

2016-03-06 13:58:16

## 不良信息举报

[LeetCode-28] Implement strStr（KMP 字符串匹配）