Algorithm: Find the first position where the substring exists 28. Implement strStr()

For the complete collection of LeetCode, please refer to: LeetCode Github Collection

topic

28. Implement strStr()

Implement strStr().

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

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().

Example 1:

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

Example 2:

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

Example 3:

Input: haystack = "", needle = ""
Output: 0

Constraints:

0 <= haystack.length, needle.length <= 5 * 104
haystack and needle consist of only lower-case English characters.

1. Exhaustive solution

The two for loops can be matched. The point that is easy to miss here is to judge whether needle is an empty string "", and if yes, return 0.

class Solution {
    
    
    public int strStr(String haystack, String needle) {
    
    
        // check null
        if (haystack == null && needle == null) {
    
    
            return 0;
        }
        if (haystack == null || needle == null) {
    
    
            return -1;
        }
        int hlen = haystack.length();
        int nlen = needle.length();
        // check ""
        if (nlen == 0) {
    
    
            return 0;
        }
        for(int i = 0; i <= hlen - nlen; i++) {
    
    
            for(int k = 0; k < nlen; k++) {
    
    
                if (haystack.charAt(i + k) != needle.charAt(k)) {
    
    
                    break;
                }
                if (k == nlen - 1) {
    
    
                    return i;
                }
            }
        }
        
        return -1;
    }
}

2. Elegant writing

Assuming that the two strings are not empty, you can use the following elegant writing.

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

Guess you like

Origin blog.csdn.net/zgpeace/article/details/114339038