package Four;
/***
* 研究kmp算法(数字之间的匹配模式)
* @author bai
* 题目描述:给你两个数字序列,你的任务是在序列a中
* 找到和序列b完全匹配的子串,如果有多个匹配的位置,
* 输出最小的那个
*/
import java.util.Scanner;
public class NumberKmp {
static int[] nextTable = new int[1000];
static int[] pattern = new int[1000];
static int[] text = new int[10000];
//创建next表
public static void getNextTable(int m){
int j =0;
nextTable[j] = -1;
int i = nextTable[j];
while(j<m){
if(i==-1||pattern[j]==pattern[i]){
i++;
j++;
nextTable[j] = i;
}else{
i = nextTable[i];
}
}
return;
}
public static int KMP(int n,int m){
getNextTable(m);
int i=0;
int j=0;
while(i<n&&j<m){
if(j==-1||text[i]==pattern[j]){
i++;
j++;
}else{
j=nextTable[j];
}
}
if(j==m){
return i-j+1;
}else{
return -1;
}
}
public static void main(String[] args) {
//caseNumber 控制循环次数 如果caseNumber=2 则可以为text和pattern数组进行两次赋值比较
int caseNumber;
Scanner scan = new Scanner(System.in);
System.out.print("caseNumber = ");
caseNumber = scan.nextInt();
while((caseNumber--)>0){
int n,m;
System.out.print("n= ");
n = scan.nextInt();
System.out.print("m= ");
m = scan.nextInt();
System.out.print("为text[]数组赋值:");
for(int i =0;i<n;i++){
text[i] = scan.nextInt();
}
System.out.print("为patter[]数组赋值:");
for(int j =0;j<m;j++){
pattern[j] = scan.nextInt();
}
System.out.println(KMP(n,m));
}
}
}
01-03
3653