【LeetCode】28. Implement strStr()

Difficulty:easy

 More:【目录】LeetCode Java实现

Description

https://leetcode.com/problems/implement-strstr/

Implement strStr().

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

Example 1:

Input: haystack = "hello", needle = "ll"
Output: 2

Example 2:

Input: haystack = "aaaaa", needle = "bba"
Output: -1

Clarification:

What should we return when needle is an empty string? This is a great question to ask during an interview.

For the purpose of this problem, we will return 0 when needle is an empty string. This is consistent to C's strstr() and Java's indexOf().

Intuition

1.Brute-force solution: Use two pointers

2. KMP algorithm 

 

Solution

Brute force solution:

    public int strStr(String haystack, String needle) {
        if(haystack==null || needle==null)
            return -1;
        for(int i=0;;i++){
            for(int j=0;;j++){
                if(j==needle.length())  return i;
                if(i+j==haystack.length())  return -1;
                if(haystack.charAt(i+j)!=needle.charAt(j))    break;
            }
        }
    }

 

    public int strStr(String haystack, String needle) {
        if(needle.isEmpty())
            return 0;
        int i=0,j=0;
        while(i<haystack.length()){
            if(haystack.charAt(i)==needle.charAt(j)){
                i++;
                j++;
                if(j==needle.length())
                    return i-j;
                if(i==haystack.length())
                    return -1;
            }else{
                i=i-j+1;
                j=0;
            }
        }
        return -1;
    }

  

    public int strStr(String haystack, String needle) {
        if(needle.length()==0)
            return 0;
        for(int i=0; i<haystack.length()-needle.length()+1; i++){
            if(haystack.charAt(i)==needle.charAt(0)){
                int j=0;
                for(; j<needle.length(); j++){
                    if(haystack.charAt(i+j)!=needle.charAt(j))
                        break;
                }
                if(j==needle.length()) 
                    return i;
            }
        }
        return -1;
    }

  

KMP:

    public int strStr(String haystack, String needle) {
        if(needle.isEmpty())
            return 0;
        int[] next = getNext(needle);
        int i=0, j=0;
        while(i<haystack.length()){
            if(j==-1 || haystack.charAt(i)==needle.charAt(j)){
                i++;
                j++;
                if(j==needle.length())
                    return i-j;
            }else{
                j=next[j];
            }
        }
        return -1;
    }
    
   //next[i]数组:
    //  1. i=0时,next[i]=-1;
    //  2. 前后缀相等长度为n时, next[i]=n;(可改进)
    //  3. 其余:next[i]=0;
    private static int[] getNext(String str) {
        if (str == null || str.isEmpty())
            return null;
        int[] next = new int[str.length()];
        next[0] = -1;
        int i = 0, j = -1;  //i为后缀的位置,j为前缀位置
        while (i < str.length() - 1) {  //此处范围注意
            if (j == -1 || str.charAt(i) == str.charAt(j)) {
                i++;
                j++;
                //next[i] = j;
                next[i] = str.charAt(i) == str.charAt(j) ? next[j] : j; //前后缀相等长度为j
            } else {
                j = next[j];
            }
        }
        return next;
    }

  

Complexity

Brute Force:

Time complexity : 

Assume that n = length of haystack and m = length of needle, then the runtime complexity is O(nm).

Space complexity :  O(1)

 

KMP:

Time complexity : O(n)

Space complexity: O(m)

 

What I've learned

1. It is a great question to ask "What should we return when needle is an empty string?"  during an interview.

 

 More:【目录】LeetCode Java实现

 

posted @ 2018-11-26 10:04  华仔要长胖  阅读(261)  评论(0编辑  收藏  举报