#leetcode#Implement strStr()

原创 2015年07月07日 02:34:18

Implement strStr().

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


这题brute force肯定要bug free, 如果能打出来O(n)的解法肯定加分, rolling hash解法必须掌握

下面的解法用3做base,Integer范围内不会溢出, 但是还是用Robin Karp的方法取余比较好, EPI上有这题的解法, 参悟一下再来update。

// https://jixiangsanbao.wordpress.com/2014/04/26/implement-strstr/
// http://blog.csdn.net/linhuanmars/article/details/20276833
public class Solution {
    public int strStr(String haystack, String needle) {
        if(haystack == null || needle == null || needle.length() == 0){
            return 0;
        }
        if(haystack.length() < needle.length()){
            return -1;
        }
        int base = 3; // 如果用大的base, 比如 7 或者 29, 31, 数值太大会溢出, 导致hash计算不对
        // 比较细心的朋友可能看出来了,这个方法的hashcode比较容易越界,因为以素数为底的幂会很大,解决的办法可以用BigInteger,或者如同Rabin–Karp algorithm - Wikipedia一样对于hashcode进行取余,但是可能存在多个字符串映射到同一hashcode的问题,尽管是很少数的情况。

        int neeHash = getHash(needle, 0, needle.length() - 1, base);
        int hayHash = getHash(haystack, 0, needle.length() - 1, base);
        
        for(int i = 0; i <= haystack.length() - needle.length(); i++){
            // verify if collision
            if(hayHash == neeHash){
                if(haystack.substring(i, i + needle.length()).equals(needle)){
                    return i;
                }
            }
            // calculate new hash
            if(i != haystack.length() - needle.length()){
                hayHash -= ((int)(haystack.charAt(i))) * Math.pow(base, needle.length() - 1);
                hayHash *= base;
                hayHash += (int)(haystack.charAt(i + needle.length()));
            }
        }
        
        return -1;
    }
    
    private int getHash(String s, int start, int end, int base){
        int res = 0;
        int k = end - start;
        for(int i = start; i <= end; i++){
            char c = s.charAt(i);
            res += ((int)c) * Math.pow(base, k--);
        }
        return res;
    }
}


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

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

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

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

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

strstr函数用法小结

strstr 函数原型: char * strstr(char * str1,char * str2);功能就是找出在字符串str1中第一次出项字符串str2的位置(也就是说字符串sr1中要包含有字符...
  • u013298384
  • u013298384
  • 2014年05月01日 13:28
  • 1743

动态规划及空间压缩 ,串的模式匹配(KMP) Implement strStr()(leetcode)

字符串交错组成对于三个字符串A,B,C。我们称C由A和B交错组成当且仅当C包含且仅包含A,B中所有字符,且对应的顺序不改变。请编写一个高效算法,判断C串是否由A和B交错组成。 给定三个字符串A,B和...
  • qq_26437925
  • qq_26437925
  • 2016年08月06日 13:17
  • 378

【leetcode c++】28 Implement strStr()

Implement strStr(). Returns the index of the first occurrenceof needle in haystack, or -1 if needle ...
  • hqq39
  • hqq39
  • 2015年06月26日 22:30
  • 201

leetcode 28 Implement strStr()

Implement strStr(). Returns the index of the first occurrence of needle in haystack, or -1 if needl...
  • jnuyanfa
  • jnuyanfa
  • 2016年04月15日 21:59
  • 197

Sunday算法的一种Java实现(Leetcode28. Implement strStr())

Leetcode第28题Implement strStr()。即寻找字符串里模式串第一次出现的位置。 这类字符串匹配查找的问题,无外乎KMP,BM,Sunday算法。KMP太烧脑,BM和Sunda...
  • qq_27680317
  • qq_27680317
  • 2017年07月30日 23:35
  • 140

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

Implement strStr():https://leetcode.com/problems/implement-strstr/ Implement strStr(). Returns the ...
  • ww2041
  • ww2041
  • 2016年08月16日 11:11
  • 1008

leetcode 28. Implement strStr()

//Implement strStr(). //Returns the index of the first occurrence of needle in haystack, or -1 if ne...
  • u011438605
  • u011438605
  • 2016年05月26日 17:26
  • 99

LeetCode 28.Implement strStr()

题目: Implement strStr(). Returns the index of the first occurrence of needle in haystack, or ...
  • caishenfans
  • caishenfans
  • 2015年02月12日 22:20
  • 225
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:#leetcode#Implement strStr()
举报原因:
原因补充:

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