28. Implement strStr()(String字符串匹配)

原创 2016年08月25日 23:12:19

题目:

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

字符串匹配算法:

算法一:Brute Force(BF或蛮力搜索) 算法

时间复杂度O(MN)

模式串从左往右与匹配串比较,匹配失败,模式串向右移动一位,直到匹配到为止。效率低下,思想简单,就不贴代码了。

算法二:KMP算法

利用不匹配字符的前面那一段字符的最长前后缀来尽可能地跳过最大的距离,需要计算模式串的跳转表next[]。如果在匹配过程中,在字符j时匹配失败,就移动模式串的next[j]到当前字符,继续匹配。

在计算模式串的next[]跳转表时,引入一个概念f(j),其含义是,对于模式串的第j个字符pattern[j],f(j)是所有满足使pattern[1...k-1] = pattern[j-(k-1)...j - 1](k < j)成立的k的最大值。

下面给出根据f(j)值求next[j]的递推公式:

如果 pattern[j] != pattern[f(j)],next[j] = f(j);

如果 pattern[j] = pattern[f(j)],next[j] = next[f(j)];

代码:

public class Solution {
	public int[] next;
    public int strStr(String haystack, String needle) {
    	if(needle.isEmpty())return 0;
    	if(haystack.isEmpty())return -1;
        next = new int[needle.length()+1];
        getNext(needle);
        int j=0,i=0;
        while(i<haystack.length())
        {
        	while(j>=0 && haystack.charAt(i)!=needle.charAt(j))j=next[j+1]-1;
        	j++;
        	i++;
        	if(j==needle.length())return i-j;
        }
        return -1;
    }
    
    public void getNext(String str)
    {
    	//next从1开始
    	int i=1,f=0;
    	while(i<str.length())
    	{
    		//找到满足pattern[k] = pattern[j]的最大k值。
    		while(f>0 && str.charAt(i-1)!=str.charAt(f-1))
    		{
    			f=next[f];
    		}
    		i++;
    		f++;
    		if(str.charAt(i-1)==str.charAt(f-1))
    		{
    			next[i]=next[f];
    		}
    		else
    		{
    			next[i]=f;
    		}
    	}
    }
}
算法三:BM(Boyer-Moore)算法 


算法四:Sunday算法

如果匹配失败,则查找目标串中,与模式串对齐最后一个字符的后面一个字符ch,并查找模式串中等于ch的字符,使之与目标串的ch对齐。

public class Solution {
	public int strStr(String haystack, String needle) {
    	if(needle.isEmpty())return 0;
    	if(haystack.isEmpty())return -1;
		int[] dic = new int[26];
		for(int i=0;i<26;i++)
		{
			dic[i]=needle.length()+1;
		}
		for(int i=0;i<needle.length();i++)
		{
			//设置每个字符离needle尾字符的长度加一
			dic[needle.charAt(i)-'a']=needle.length()-i;
		}
		//目标字符串与模式串对其位置
		int pos=0;   
		int i,j;
		while(pos<haystack.length()-needle.length()+1)
		{
			i=pos;
			for(j=0;j<needle.length();++j,++i)
			{
				if(haystack.charAt(i)!=needle.charAt(j))
				{
					//查找目标串中,与模式串对齐最后一个字符的后面那个字符ch,
					//并查找模式串中等于ch的字符,使之与目标串的ch对齐
					if(pos+needle.length()<haystack.length()-needle.length()+1)
					pos+=dic[haystack.charAt(pos+needle.length())-'a'];
					else pos++;
					break;
				}
			}
			if(j==needle.length())return pos;
		}
		
		return -1;
	}
}


参考文献:http://blog.csdn.net/joylnwang/article/details/6778316/

http://blog.163.com/yangfan876@126/blog/static/80612456201342205056344/

版权声明:本文为博主原创文章,未经博主允许不得转载。

【LeetCode-面试算法经典-Java实现】【028-Implement strStr() (实现strStr()函数)】

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

C中strstr的实现方法

做题目的时候需要自己实现strstr函数/************************************************************************/ /* ...
  • zhyh1435589631
  • zhyh1435589631
  • 2015年07月10日 17:01
  • 1559

Implement strStr(字符串查找)

重点内容对于一个给定的 source 字符串和一个 target 字符串,你应该在 source 字符串中找出 target 字符串出现的第一个位置(从0开始)。如果不存在,则返回 -1 先上一个粗...
  • mogusuntou
  • mogusuntou
  • 2017年01月17日 10:20
  • 150

[C++]Implement strStr() 找到子字符串第一次出现的位置

leetcode 原题链接:https://leetcode.com/problems/implement-strstr/ Implement strStr(). Returns th...
  • lyy_hit
  • lyy_hit
  • 2015年08月23日 20:14
  • 1206

【小熊刷题】implement strstr()

QuestionImplement strstr(). Returns the index of the first occurrence of needle in haystack, or –1 i...
  • huilaner
  • huilaner
  • 2015年08月10日 04:42
  • 156

c,c++中字符串处理函数strtok,strstr,strchr,strsub

1,字符串切割函数 函数原型:char *strtok(char *s, char *delim); 函数功能:把字符串s按照字符串delim进行分割,然后返回分割的结果。 函...
  • wangqing_12345
  • wangqing_12345
  • 2016年06月25日 22:37
  • 3902

和大神们学习每天一题(leetcode)-Implement strStr()

Implement strStr(). Returns the index of the first occurrence of needle in haystack, or -1 if nee...
  • majunyangyang
  • majunyangyang
  • 2014年12月08日 09:20
  • 206

LeetCode: Implement strStr()(字符串匹配:Sunday算法)

LeetCode: Implement strStr()(字符串匹配)Implement strStr().Returns the index of the first occurrence of n...
  • BestZem
  • BestZem
  • 2016年07月21日 22:16
  • 178

字串查找算法总结及MS的strstr源码

http://www.cnblogs.com/ziwuge/archive/2011/12/09/2281455.html 首先来说说字串的查找,即就是在一个指定的字串A中查找一个指定字串B出现的位...
  • kerwinash
  • kerwinash
  • 2014年08月18日 15:38
  • 1004

strstr解决字符串匹配

题目说起来很简单,你会读到两个字符串,每个字符串占据一行,每个字符串的长度均小于10000字符,而且第一个字符串的长度小于第二个字符串的。你的程序要找出第一个字符串在第二个字符串中出现的位置,输出这些...
  • qq_36950065
  • qq_36950065
  • 2017年02月18日 17:54
  • 623
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:28. Implement strStr()(String字符串匹配)
举报原因:
原因补充:

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