实现 strStr()
函数。
给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。
示例 1:
输入: haystack = “hello”, needle = “ll”
输出: 2
示例 2:
输入: haystack = “aaaaa”, needle = “bba”
输出: -1
题解
参考资料:
Java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| public class KMP { public static int[] getNextTable(String needle) { int len = needle.length(); int[] next = new int[len]; next[0] = -1; int lp = -1, rp = 0;
while (rp < len - 1) { if (lp == -1 || needle.charAt(rp) == needle.charAt(lp)) next[++rp] = ++lp; else lp = next[lp]; }
return next; }
public static int getIndex(String haystack, String needle) { int haystackLen = haystack.length(); int needleLen = needle.length();
if (needleLen == 0) return 0; int haystackCur = 0, needleCur = 0; int[] next = getNextTable(needle);
while (haystackCur < haystackLen && needleCur < needleLen) { if (haystack.charAt(haystackCur) == needle.charAt(needleCur)) { haystackCur++; needleCur++; } else { if (needleCur == 0) haystackCur++; else needleCur = next[needleCur]; } }
return needleCur == needleLen ? haystackCur - needleCur : -1; } }
|
Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| class KMP: def get_next_table(self, needle): length = len(needle) lp, rp = -1, 0 next_table = [0] * length next_table[0] = -1
while rp < length - 1: if needle[lp] == needle[rp] or lp == -1: rp += 1 lp += 1 next_table[rp] = lp else: lp = next_table[lp]
return next_table
def get_index(self, haystack, needle): haystack_len = len(haystack) needle_len = len(needle)
if needle_len == 0: return 0 haystack_cur, needle_cur = 0, 0 next_table = self.get_next_table(needle)
while haystack_cur < haystack_len and needle_cur < needle_len: if haystack[haystack_cur] == needle[needle_cur]: haystack_cur += 1 needle_cur += 1 else: if needle_cur == 0: haystack_cur += 1 else: needle_cur = next_table[needle_cur]
return haystack_cur - needle_cur if needle_cur == needle_len else -1
|
Go
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| func getNextTable(needle string) []int { length := len(needle) lp, rp := -1, 0 next := make([]int, length) next[0] = -1
for rp < length-1 { if lp == -1 || needle[lp] == needle[rp] { rp++ lp++ next[rp] = lp } else { lp = next[lp] } }
return next }
func getIndex(haystack, needle string) int { haystackLen := len(haystack) needleLen := len(needle)
if needleLen == 0 { return 0 }
haystackCur, needleCur := 0, 0 next := getNextTable(needle)
for haystackCur < haystackLen && needleCur < needleLen { if haystack[haystackCur] == needle[needleCur] { haystackCur++ needleCur++ } else { if needleCur == 0 { haystackCur++ } else { needleCur = next[needleCur] } } }
if needleCur == needleLen { return haystackCur - needleCur } else { return -1 } }
|