LeetCode第28题
/*
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
*/
public class ImplementstrStr{
public static void main(String[] args){
String haystack = "mississippi";
String needle = "mississippi";
ImplementstrStr iss = new ImplementstrStr();
int result = iss.strStr(haystack,needle);
System.out.println(result);
}
public int strStr(String haystack, String needle) {
if (haystack == null || needle == null) return -1;
if (haystack.length() < needle.length()) return -1;
// 空字符串是任何字符串的子串
if ("".equals(needle)) return 0;
// 和01版本的思想几乎等同
// 看似只用了一个for循环(但是有回退操作),实则等效有一个内部循环
// 没有01版本思路清晰,而且当剩下子串长度不足时不会提前结束比较
int j = 0;
for (int i=0;i<haystack.length();i++){
// 前j个字符相等就一直往下比较,否则从i+1处重新开始比较
if (haystack.charAt(i) == needle.charAt(j)) {
j++;
if (j == needle.length()) return i - j + 1;
}else {
// i减去i从开始标记位置多走的位移
i = i - j;
// j清零
j = 0;
}
}
return -1;
}
public int strStr01(String haystack, String needle) {
if (haystack == null || needle == null) return -1;
if (haystack.length() < needle.length()) return -1;
// 空字符串是任何字符串的子串
if ("".equals(needle)) return 0;
for (int i=0;i<haystack.length();i++){
// 剩余子串长度不够则跳出
if (haystack.length() - i < needle.length()) break;
// 比对两个子串的每一个字符
int cur = i;
for (int j=0;j<needle.length();j++){
if (haystack.charAt(cur++) != needle.charAt(j)) break;
if (j == needle.length() - 1) return i;
}
}
return -1;
}
}