普通字符串匹配代码:
public class ModelMatch {
public static void main(String[] args) {
// 定义主串
String primary = "ababcabcacbab";
char[] pri = primary.toCharArray();
// 定义子串
String son = "abcac";
char[] mod = son.toCharArray();
int flag = index(pri, mod);
System.out.println(flag);
}
/**
* @匹配函数 找出子串在主串第一次出现的位置并返回,如果没有,则返回0
* @param pri
* 主串
* @param son
* 子串
* @return
* @return int
*/
public static int index(char[] pri, char[] son) {
int i = 0; // 主串下标起始位置
int j = 0; // 子串下标起始位置
while (i < pri.length && j < son.length) {
// 如果字符匹配,则继续比较下一个字符
if (pri[i] == son[j]) {
i++;
j++;
} else { // 否则主串下标进 1, 子串的下标恢复为起始位置 0。重新开始匹配
i = i - j + 1;
j = 0;
}
}
// 如果相等j的下标==子串长度,表示找到
if (j == son.length)
return i - son.length;//返回匹配的下标位置
else
return 0;
}
}
KMP实现字符串匹配代码:
public class KMP {
//static int[] next = new int[0];
public static void main(String[] args) {
String primary = "ababcabcacbab";
String modle = "abcac";
char[] pri = primary.toCharArray();
char[] mod = modle.toCharArray();
int flag = index_KMP(pri,mod);
if(flag!=0){
System.out.println("开始匹配的位置是: "+flag);
}else{
System.out.println("主串不包含子串。。。");
}
}
public static int index_KMP(char[] primary, char[] modle) {
int i = 0;// 记录主串的下标
int j = 0;// 记录模式串的下标
// 获取next的函数值
int[] next = getNext(modle);
while (i < primary.length && j < modle.length) {
try{
if (j == -1 || primary[i] == modle[j]) {
i++;
j++;
} else {
j = next[j];
}}catch(ArrayIndexOutOfBoundsException e){
System.out.println("数组越界");
}
}
if(j>=modle.length){
return i-modle.length;
}else{
return 0;
}
}
/**
* 求模式串model的next函数值并存入数组next中
*
* @param model
* @return void
*/
public static int[] getNext(char[] model) {
int[] next = new int[model.length];
int i = 0; // 模式串的其实下标,并赋初值
next[0] = -1;//next函数的定义
int j = -1;// next数组的元素值
while(i<model.length-1){
if(j==-1 || model[i]==model[j]){
i++;
j++;
next[i] = j;
}
else{
j = next[j];
}
}
return next;
}
}