java对index的四种算法实现字符串模式匹配
java新手第一次尝试
第一次写博客,就把今天写的四种方法记录下来
import java.util.Scanner;
public class algorithm {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入主串:");
String S = sc.nextLine();
System.out.println("请输入子串:");
String T = sc.nextLine();
System.out.println("请输入查找起始位置:");
int pos = sc.nextInt();
System.out.println("算法一匹配的位置为:" + index1(S, T,pos));
System.out.println("算法二匹配的位置为:" + index2(S, T,pos));
System.out.println("算法三匹配的位置为:" + index3(S, T,pos));
System.out.println("算法四匹配的位置为:" + index4(S, T,pos));
}
/*
* BF算法1
*/
public static int index1(String S, String T , int pos) {
int i = pos;
int j = 0;
char[] arrS = S.toCharArray();
char[] arrT = T.toCharArray();
int lenS = arrS.length;
int lenT = arrT.length;
if(i < 0 && i > arrS.length) {
return -1 ;
}
if (lenS < lenT) {
return -1;
}
for (i = pos; i <= lenS - lenT; i++) {
int tem = i;
for (j = 0; j < lenT; j++) {
if (arrS[tem++] != arrT[j]) {
break;
}
if (j == lenT - 1) {
return i;
}
}
}
return -1;
}
/*
* BF算法2
*/
public static int index2(String S, String T, int pos) {
int i = pos;
int j = 0;
char[] arrS = S.toCharArray();
char[] arrT = T.toCharArray();
int lenS = arrS.length;
int lenT = arrT.length;
while (i <= lenS - 1 && j <= lenT - 1) {
if (arrS[i] == arrT[j]) {
++i;
++j;
} else {
i = i - j + 1;
j = 0;
}
}
if(j == 0 && arrS[j] == arrT[j]) {
return 0 ;
}
if (j == lenT && j != 0 ) {
return i - lenT ;
}
return -1;
}
/*
* KMP算法
*/
public static void Getnext(int next[], String T) {
char[] arrT = T.toCharArray();
int lenT = arrT.length;
int j = 0, k = -1;
next[0] = -1;
while (j < lenT - 1) {
if (k == -1 || arrT[j] == arrT[k]) {
j++;
k++;
next[j] = k;
} else
k = next[k];
}
}
public static int index3(String S, String T,int pos) {
int[] next = new int[255];
int i = pos;
int j = 0;
char[] arrS = S.toCharArray();
char[] arrT = T.toCharArray();
Getnext(next, T);
while (i < arrS.length && j < arrT.length) {
if (j == -1 || arrS[i] == arrT[j]) {
i++;
j++;
} else {
j = next[j];
}
}
if (j >= arrT.length) {
return (i - arrT.length);
}
return -1;
}
/*
* Sunday算法
*/
public static int index4(String S, String T,int pos) {
int i = pos;
int j = 0;
char[] arrS = S.toCharArray();
char[] arrT = T.toCharArray();
int start = 0;
while (i < arrS.length && j < arrT.length) {
start = i;
if (arrS[i] == arrT[j]) {
i++;
j++;
} else {
start = start + arrT.length;
if (start > arrS.length) {
return -1;
}
boolean flag = false;
for (int k = 0; k < arrT.length; k++) {
if(start >= arrS.length) {
return -1;
}
if (arrS[start] == arrT[k]) {
flag = true;
i = i + arrT.length - k;
break;
}
}
if (flag == false) {
i = i + arrT.length + 1;
}
j=0;
}
}
if (j >= arrT.length) {
return (i - arrT.length);
}
return -1;
}
}