题目描述
实现 strStr() 函数。
给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。
示例1
输入: haystack = "hello", needle = "ll"
输出: 2
示例二
输入: haystack = "aaaaa", needle = "bba"
输出: -1
方法一:暴力解法
对应Java代码
class Solution {
public int strStr(String haystack, String needle) {
char[] t = haystack.toCharArray();
char[] p = needle.toCharArray();
int i = 0, j = 0;
while(i < t.length && j < p.length) {
if (t[i] == p[j]) {
i++;
j++;
} else {
i = i - j + 1;
j = 0;
}
}
if (j == p.length) {
return i - j;
} else {
return -1;
}
}
}
方法二:KMP算法
对应 java 代码
class Solution {
public int strStr(String haystack, String needle) {
if (needle.length() == 0) {
return 0;
}
char[] t = haystack.toCharArray();
char[] p = needle.toCharArray();
int[] next = getNext(needle);
int i = 0, j = 0;
while (i < t.length && j < p.length) {
while (j > 0 && t[i] != p[j]) {
j = next[j - 1];
}
if (t[i] == p[j]) {
// i++;
j++;
}
i++;
}
if (j == p.length) {
return i - j;
} else {
return -1;
}
}
public int[] getNext(String needle) {
int j = 0; // j为前缀末尾
int[] next = new int[needle.length()];
next[0] = j;
for (int i = 1; i < needle.length(); i++) { // i为后缀末尾
while (j > 0 && needle.charAt(i) != needle.charAt(j)) {
j = next[j - 1];
}
if (needle.charAt(i) == needle.charAt(j)) {
j++;
}
next[i] = j;
}
return next;
}
}