实现strStr()
这道题看似是一道简单题,第一种方法是暴力解决,但是稍微一想就能发现可以用数据结构中的KMP算法来解决。
方法一:暴力
class Solution {
public int strStr(String haystack, String needle) {
int n = haystack.length(), m = needle.length();
for (int i = 0; i + m <= n; i++) {
boolean flag = true;
for (int j = 0; j < m; j++) {
if (haystack.charAt(i + j) !=needle.charAt(j)) {
flag = false;
break;
}
}
if (flag) {
return i;
}
}
return -1;
}
}
方法二:KMP算法
推荐大家去看下面的视频,非常简单易懂,理解KMP。
KMP讲解视频
class Solution {
public int strStr(String haystack, String needle) {
int m = needle.length(), n = haystack.length();
if(m == 0) return 0;
int pi[] = new int[m];//next数组
for(int i = 1, j = 0; i < m; i++){
while(j > 0 && needle.charAt(i) != needle.charAt(j)){
//往找到前面一个匹配的子串位置,直到j = 0为止
j = pi[j-1];
}
if(needle.charAt(j) == needle.charAt(i)){
j++;// j 和 i 位置字符相等的时候,就两个都右移,因为子串相等,继续往后匹配
}
//pi[i] = j的位置加一,也就是最大相等的子串的后一个位置
pi[i] = j;
}
for(int i = 0, j = 0; i < n; i++){
while(j > 0 && (haystack.charAt(i) != needle.charAt(j))){
j = pi[j - 1];
}
if(needle.charAt(j) == haystack.charAt(i)){
j++;
}
if(j == m){
return i - m + 1;
}
}
return -1;
}
}
题目地址:strStr()