For the complete collection of LeetCode, please refer to: LeetCode Github Collection
topic
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;
}
}
}
}