import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class KMP {//动态规划思想结合原始思想(状态转移)
private int [][]dp;//状态转移数组
private String pat;//模式串(搜索的字符串)
static List<Integer>list;//记录初始位置及个数的列表
public KMP(String pat) {
this.pat = pat;
int m=pat.length();
list=new ArrayList<>();
//dp[状态][字符] = 下个状态
dp=new int[m][256];
//base case
dp[0][pat.charAt(0)]=1;
//前方相同前缀字符位置索引初始化为0
int X=0;
//构建状态转移图
for (int i = 1; i < m; i++) {
for (int c = 0; c <256 ; c++) {
dp[i][c]=dp[X][c];
dp[i][pat.charAt(i)]=i+1;
//更新前方相同前缀字符位置索引
X=dp[X][pat.charAt(i)];
}
}
}
public void search(String txt){
int m=pat.length();
int n=txt.length();
//pat的初始状态为0
int j=0;
for (int i = 0; i <n ; i++) {
//计算pat的下一个状态
j=dp[j][txt.charAt(i)];
//到达终止状态,将起始位置加入列表,继续搜索
if (j==m) {
list.add(i-m+1);
j=0;
}
}
}
public void print(){
int n=list.size();
System.out.println("出现的总次数:"+n);
for (int i = 0; i <n ; i++) {
System.out.print("出现的起始位置:"+list.get(i)+"\t");
}
}
public static void main(String[] args) throws IOException {
Scanner scanner=new Scanner(new File("strings.txt"));
StringBuilder builder=new StringBuilder();
while (scanner.hasNextLine()){
String s= scanner.nextLine();
builder.append(s);
System.out.println(s);
}
KMP kmp=new KMP("wgw");
String txt=builder.toString();
kmp.search(txt);
kmp.print();
}
}
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交