KMP算法的Java实现
2017-07-15 18:14
323 查看
输入
第一行一个整数N,表示测试数据组数。接下来的N*2行,每两行表示一个测试数据。在每一个测试数据中,第一行为模式串,由不超过10^4个大写字母组成,第二行为原串,由不超过10^6个大写字母组成。
其中N<=20
输出
对于每一个测试数据,按照它们在输入中出现的顺序输出一行Ans,表示模式串在原串中出现的次数。import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = Integer.parseInt(sc.nextLine());
String pattern = "", str = "";
for(int i = 0; i < N; i++){
pattern = sc.nextLine();
str = sc.nextLine();
System.out.println(KMP(pattern, str));
}
}
public static int KMP(String pattern, String str) {
int[] next = calNext(pattern);
int count = 0, i = 0, j = 0;//初始状态
while(i < str.length()){
if(str.charAt(i) == pattern.charAt(j)){//当前字符相同
if(j == pattern.length() - 1){//匹配成功
count++;
i++;
j = next[j];
}else{//继续匹配下一字符
i++;
j++;
}
}else{//当前字符不同
if(j == 0){//如果已经是模式串的第一个字符
i++;
}else{
j = next[j - 1];
}
}
}
return count;
}
/**
* 计算next数组
* @param pattern 模式串
* @return
*/
public static int[] calNext(String pattern) {
int[] next = new int[pattern.length()];
next[0] = 0;
int i = 1, j = 0;
while(i < pattern.length()){
if(pattern.charAt(i) == pattern.charAt(j)){
next[i++] = ++j;
}else{
if(j == 0){
next[i++] = 0;
}else{
j = next[j-1];
}
}
}
return next;
}
}
相关文章推荐
- 字符串匹配之KMP算法思路、原理与Java实现
- java实现的KMP算法
- KMP算法(字符串匹配算法)详解及java实现
- KMP算法----java实现
- 【转载】【数据结构&&算法系列】KMP算法介绍及实现(c++ && java)
- KMP算法----java实现
- java实现的KMP算法
- Java实现KMP算法(转)
- Java实现KMP算法
- KMP算法java实现之策略模式
- java实现字符串kmp算法
- 对KMP的理解,以及kmp算法java版本实现
- 数据结构Java实现——③串--->串的模式匹配:Brute-Force算法和 KMP算法
- KMP算法java实现
- 字符串搜索的KMP算法实现(java版)
- KMP算法的实现(Java语言描述)
- 字符匹配KMP算法 java实现
- KMP算法及Java实现
- Java实现KMP算法
- 【算法总结】KMP算法及java实现