kmp之前的铺垫,暴力匹配
package com.gxmedu.kmp;
/**
* @author 郭学明
* @version 1.0
*/
public class ViolenceMatch {
public static void main(String[] args) {
String s1 = "硅硅谷 尚硅谷你尚硅 尚硅谷你尚硅谷你尚硅你好";
String s2 = "尚硅谷你尚硅";
int index = violenceMatch(s1,s2);
System.out.println(index);
}
public static int violenceMatch(String src,String find){
char[] src2 = src.toCharArray();
char[] find2 = find.toCharArray();
int srcLen = src2.length;
int findLen = find2.length;
for (int i = 0 , j = 0; i < srcLen & j < findLen ; ) {
if(src2[i] == find2[j]){
if(j == findLen - 1){
return i - j;
}
i++;
j++;
}else{
i -= j - 1;
j = 0;
}
}
return -1;
}
}
package com.gxmedu.kmp;
/**
* @author 郭学明
* @version 1.0
*/
public class KMP {
public static void main(String[] args) {
String s1 = "硅硅谷 尚硅谷你尚硅 尚硅谷你尚硅谷你尚硅你好";
String s2 = "尚硅谷你尚 硅谷";
int[] next = kmpNext(s2);
int index = kmpSearch(s1,s2,next);
System.out.println(index);
}
public static int kmpSearch(String src,String pattern,int[] next){
for (int i = 0,j = 0; i < src.length(); i++) {
while(j > 0 && src.charAt(i) != pattern.charAt(j)){
j = next[j - 1];
}
if(src.charAt(i) == pattern.charAt(j)){
j++;
}
if(j == pattern.length()){
return i - j + 1;
}
}
return -1;
}
public static int[] kmpNext(String pattern){
if(pattern == null){
return null;
}
int[] next = new int[pattern.length()];
next[0] = 0;
for (int i = 1,j = 0; i < next.length ; i++) {
if(pattern.charAt(i) == pattern.charAt(j)){
j++;
}
while(j > 0 && pattern.charAt(i) != pattern.charAt(j)){
j = next[j - 1];
}
next[i] = j;
}
return next;
}
}