字符串查找——KMP算法

字符串查找——KMP算法

在这里插入图片描述

java源码:



public class KMP {
	//pattern 原字符串,prefix 每个字符对应重复的字符个数,n字符串长度
	public static void prefix_table(char []pattern,int[]prefix,int n){
		prefix[0]=0;
		for(int i=1;i<n;i++){
			int j=i;	//j:比较位置
			while(j>0){//若与前一个字符的prefix对应位置的字符j不相等,则再
				//与j前一个字符的prefix对应的值的字符对比
				j=prefix[j-1];
				if(pattern[i]==pattern[j]){
					prefix[i]=j+1;//最后如果 一个相等的都没找到,结果就为默认值0.
					break;
				}
			}
			
		}
	
		int m=prefix.length;
		for(int j=m-1;j>0;j--){
			prefix[j]=prefix[j-1];
		}
		prefix[0]=-1;
	}
	public static void move_prefix_table(int[]prefix,int n){	
		
	}
	public static void KMP_search(char[]pattern,char[]text){
		//n ,m分别表示 pattern,text 的字符长度
		int n=pattern.length;
		int m=text.length;
		int prefix[]=new int[n];
		prefix_table(pattern,prefix,n);
		int i=0,j=0;//分别指向pattern 和 text 的首位置
		
		while(j<m){
			//System.out.println(i+" "+j);
			if(i==n-1&&pattern[i]==text[j]){
				System.out.println("找到位置:"+(j-i));
				i=prefix[i];
			}
			if(pattern[i]==text[j]){
				i++;
				j++;
			}else{
				i=prefix[i];
				if(i==-1){//当第一个元素都不相等的时候,i指向pattern中第一个元素,j指向text中的下一个元素。
					i=0;
					j++;
				}
			}
		}
		
	}
	public static void main(String[] args) {
		char []pattern="A".toCharArray();
		char[]text="BABC".toCharArray();
		KMP_search(pattern,text);
	}

}

猜你喜欢

转载自blog.csdn.net/Y734493585/article/details/89481180