找出字符串中第一个匹配项
思路
这个就是数据结构中学的串的模式匹配,一种是简单匹配,匹配失败返回本次匹配开始的位置,重新匹配。还有一种是KMP算法,有些忘了。
总结
题解给出了也是普通集KMP两种解法。
代码
普通匹配O(m*n)
public static int strStr(String haystack, String needle) {
int len1=haystack.length();
int len2=needle.length();
int i=0;int j=0;
while (i<len1 && j<len2){
if (haystack.charAt(i)==needle.charAt(j)){
j++;
}else {
i=i-j;
j=0;
}
i++;
}
if (j==len2) return i-j;
else return -1;
}
KMP算法O(m+n),其中O(m)为构建next数组复杂度,O(n)为遍历母串复杂度。
为匹配串建立一个next数组,匹配失败根据next数组来进行回溯。
这里采用了前缀表不减一
public static int strStr(String haystack, String needle) {
int len1=haystack.length();
int len2=needle.length();
int i=1;int j=0;
int[] next=new int[len2];
next[0]=0; //next数组第一个数值默认为0
while (i<len2){ //next数组数值基于子串操作
while (j>0 && needle.charAt(j)!=needle.charAt(i))
j=next[j-1];
if (needle.charAt(j)==needle.charAt(i)) {
j++;
}
next[i]=j;
i++;
}
System.out.println(Arrays.toString(next));
i=0;j=0;
while (i<len1 && j<len2){
while (j>0 && haystack.charAt(i)!=needle.charAt(j)){
j=next[j-1];
}
if (haystack.charAt(i)==needle.charAt(j)) {
j++;
}
i++;
if (j==len2) return i-j;
}
return -1;
}