[LeetCode-28] Implement strStr(KMP 字符串匹配)

原创 2015年11月20日 17:59:41

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

【解题思路】

采用 字符串匹配算法 KMP 算法的思想

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-面试算法经典-Java实现】【028-Implement strStr() (实现strStr()函数)】

[【028-Implement strStr() (实现strStr()函数)】](028-Implement strStr() (实现strStr()函数))【LeetCode-面试算法经典-Jav...
  • DERRANTCM
  • DERRANTCM
  • 2015年07月25日 08:08
  • 2627

strstr解决字符串匹配

题目说起来很简单,你会读到两个字符串,每个字符串占据一行,每个字符串的长度均小于10000字符,而且第一个字符串的长度小于第二个字符串的。你的程序要找出第一个字符串在第二个字符串中出现的位置,输出这些...
  • qq_36950065
  • qq_36950065
  • 2017年02月18日 17:54
  • 619

strstr函数与KMP算法比较

代码: //KMP算法 #include #include #include #include #include //Copyright 1990 Software Developmen...
  • huguangshanse00
  • huguangshanse00
  • 2015年10月25日 16:20
  • 2054

字符串匹配算法KMP详细解释——深入理解

1. 前言  字符串匹配是一个经典算法问题,展开来讲各类问题多达几十种,有名称的算法也不下三十种,所以需要深入学习的东西有很多。这次我们来探讨一个最简单的问题,假设现在随机输入一个长度为m的主串T,另...
  • FX677588
  • FX677588
  • 2016年12月04日 16:09
  • 3336

KMP字符串匹配(初学者必看,讲的很清晰)

从头到尾彻底理解KMP 首先声明一下,本博文转自July的博客,之前看了很多关于KMP算法的博客,发现都没讲清楚,但看了July的博客后,我就对KMP算法有了一个很清楚的...
  • luoshengkim
  • luoshengkim
  • 2015年03月29日 10:34
  • 2813

<C/C++算法>字符串匹配---KMP算法

KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现,因此人们称它为克努特——莫里斯——普拉特操作(简称KMP算法)。KMP算法的关键是利用匹配...
  • EbowTang
  • EbowTang
  • 2015年10月14日 19:14
  • 5671

字符串模式匹配算法--详解KMP算法

在软考的复习中,看到过几次 字符串的模式匹配算法。看起来挺难的。所以花了点时间查了查关于字符串匹配的算法。下面详细介绍一下KMP模式匹配算法 以及next[j]函数如何计算。...
  • zc474235918
  • zc474235918
  • 2014年10月26日 10:14
  • 3033

ACM-字符串-模式串匹配-KMP算法

KMP
  • u011787119
  • u011787119
  • 2016年01月17日 22:23
  • 1550

字符串匹配算法KMP Java实现

kmp算法的核心思想:先对搜索字串生成偏移对照表,匹配时从左向右依次比较(bm从右向左,号称比kmp更快),相等则文档和搜索字串的下标+1迭代,否则查表,定位最优的偏移位置(文档下标不变,搜索字串下标...
  • a386347993
  • a386347993
  • 2015年01月09日 10:49
  • 1038

史上最浅显易懂的KMP算法讲解:字符串匹配算法

KMP算法是一种改进后的字符串匹配算法,由D.E.Knuth与V.R.Pratt和J.H.Morris同时发现,因此人们称它为克努特-莫里斯-普拉特操作(简称KMP算法)。 KMP算法又称“看毛片”算...
  • wangbaochu
  • wangbaochu
  • 2016年02月18日 20:32
  • 9326
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[LeetCode-28] Implement strStr(KMP 字符串匹配)
举报原因:
原因补充:

(最多只允许输入30个字)