BF
- 最简单易懂的写法,也是性能最差的写法。
- 最坏时间复杂度:
O(n*m)
public static int BF(String str1,String str2,int pos) {
int lenstr1 = str1.length();
int lenstr2 = str2.length();
if (pos < 0 || pos > lenstr1) {
return -1;
}
int i = pos;
int j = 0;
while (i < lenstr1 && j < lenstr2) {
if (str1.charAt(i) == str2.charAt(j)) {
i++;
j++;
} else {
i = i - j + 1;
j = 0;
}
}
if (j >= str2.length()) {
return i - j;
} else {
return -1;
}
}
KMP
- 主要分为两步,第一步,求
next
数组,第二步,匹配
next数组
next
数组是对于一个字符串而言的,比如我们求str2
在str1
中是否存在,如果存在返回str2
在str1
中的起始索引,那么我们就要求出str2
的next
数组
- 那字符串的
next
数组怎么求呢。
- 假设字符串
abcabct
,对于t
,它前面的字符串是abcabc
,abcabc
的前缀为a
,ab
,abc
,abca
,abcab
;它的后缀c
,bc
,abc
,cabc
,bcabc
(前缀不能包含最后一位,后缀不能包含最前一位,所以前缀不能是abcabc
,后缀也不能是abcabc
)。前缀与后缀中最长的相等的字符串是abc
,所以t
的next
数组值为abc
的长度,即为3
。
- 同理,对于
c
,它前面的字符串为abcab
,前缀为a
,ab
,abc
,abca
;后缀为b
,ab
,cab
,bcab
。前缀与后缀中