题目

有两个字符串,要求确定较短字符串在较长字符串中的位置。

暴力匹配

使用两层循环,一旦不匹配就将子串后移一位,时间复杂度为O(mn)

KMP算法

NEXT[]数组

构建next数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
private void getNext(String p, int next[]) {
int len = p.length();
int right = 0;
int left = -1;
next[0] = -1;
while (right < len - 1) {
if (left == -1 || p.charAt(right) == p.charAt(left)) {
right++;
left++;
next[right] = left;
} else
left = next[left];
}
}

匹配过程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public int strStr(String target, String pattern) {
if (pattern.length() == 0)
return 0;
int t = 0;
int p = 0;
int[] next = new int[pattern.length()];
getNext(pattern, next);
while (t < target.length() && p < pattern.length()) {
if (p == -1 || target.charAt(t) == pattern.charAt(p)) {
t++;
p++;
} else {
p = next[p];
}
if (p == pattern.length())
return t - p;
}
return -1;
}