package com.xiyou.dome;
import java.io.*;
import java.util.Arrays;
/**
* 单词检索统计
* 要求:一个文件 txt。 找到关键字符串的位置。
*
* @author
* @version 1.0
*/
public class Text {
public static void main(String[] args) throws IOException {
//1.写入匹配字符
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
char[] str = in.readLine().toCharArray();
char[] T = new char[str.length+1];
T[0] = (char) str.length;
for (int i = 1;i<T.length;i++){ // 1 2 3
T[i] = str[i-1];
}
//获取类对象
Text text = new text();
//2.读取文本文档
String result = "";
BufferedReader br = new BufferedReader(new FileReader("C:\\Users\\86151\\Desktop\\a.txt"));
//构造一个BufferedReader类来读取文件
String s = null;
while ((s = br.readLine()) != null) {
// 使用readLine方法,一次读一行
result = result + s +' ';
}
br.close();
System.out.println("主串:"+result);
char[] st = result.toCharArray();
char[] S = new char[st.length+1];
S[0] = (char) st.length;
for (int i = 1;i<S.length;i++){ // 1 2 3
S[i] = st[i-1];
}
//3.获取next数组
int[] arr = new int[str.length+1];
int[] arrs = text.get_next(T,arr);
//4.进行匹配
int[] nums = text.val(S,T,1,arrs);
System.out.print("T串"+Arrays.toString(T)+"在文档中出现的位置:");
for(int f =0;f<nums.length;f++){
if(nums[f]>0){
System.out.print(nums[f]);
System.out.print(' ');
}
}
}
// 得到next数组
public int[] get_next(char T[],int arr[]){
int i,j;
i = 1;
j = 0;
arr[1] = 0;
while(i<T[0]){
if(j==0||T[i]==T[j]){
i++;//7
j++;// 2
arr[i] = j;
}else{
j = arr[j];
}
}
return arr;
}
//计算nextval数组
public void get_nextval(char T[],int arr[]){
int i,k;
i = 1;
k = 0;
get_next(T,arr);
int[] num = new int[arr.length];
num[1] = 0;
while(i<T[0]){
if(k==0||T[i]==T[k]){
i++;//7
k++;// 2
if(T[i]!=T[k]){
num[i] = k;
}else{
num[i] =num[k];
}
}else{
k = num[k];
}
}
}
//匹配
public int[] val(char S[], char T[], int pos, int[] arr){
int i = pos; //
int j = 1; // T的下标
int k=0;
int[] next = arr;
System.out.println("next数组:"+Arrays.toString(next));
int[] num = new int[S.length];
while(i<S.length) {
while (j < T.length && j>0) {
if ( S[i] == T[j] ) {
i++;
j++;
}
else {
j = next[j];
}
}
if (j >= T.length ) {
num[k] = i-T[0];
k+=1;
j=1;
}
if( j ==0){
i++;
j=1;
}
}
return num;
}
}
KMP算法的字符检索系统
最新推荐文章于 2022-08-27 22:19:44 发布