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().
Solution1
public class Solution1 {
/**
* 先找到第一个匹配的字符,接着对余下子串进行匹配,
* 失配则在主串中寻找下一个匹配到子串第一个字符的位置
* 特殊情况:
* 1. 子串为空或为空串->返回0
* 2. 主串为空或为空串->返回-1
* @param haystack
* @param needle
* @return 子串在主串中第一次出现的位置
*/
public int strStr(String haystack, String needle) {
if (needle == null || needle.equals("")) {
return 0;
}
if (haystack == null || haystack.equals("")) {
return -1;
}
int start = 0;
while (start <= haystack.length() - needle.length() &&
needle.charAt(0) != haystack.charAt(start++));
if (start > 0) start--;
if (needle.charAt(0) != haystack.charAt(start)) return -1;
for (int i = 1; i < needle.length(); i++) {
if (start + i >= haystack.length()) return -1;
if (needle.charAt(i) != haystack.charAt(start + i)) {
start++;
while (start <= haystack.length() - needle.length()) {
if (haystack.charAt(start) == needle.charAt(0)) {
break;
} else {
start++;
}
}
if (start > haystack.length() - needle.length()) return -1;
i = 0;
}
}
return start;
}
}
Solution2
public class Solution2 {
public int strStr(String haystack, String needle) {
if (needle == null || needle.length() == 0) return 0;
for (int i = 0; i <= haystack.length() - needle.length(); i++) {
if (haystack.substring(i, i + needle.length())
.equals(needle)) return i;
}
return -1;
}
}