KMP模式匹配算法总结

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/StarsionBlog/article/details/70186277

KMP算法主要是对朴素的模式匹配算法的改进,假设有String A和String B,i为A的首个字母的下标,j为B的首个字母的下标,即i=0,j=0,现要在A中匹配B,若用朴素的模式匹配算法,则i需要不断的回溯,如A=acbxacbd,B=abcd,当i=3,j=3时,发现字符不相等,如果使用的是朴素的模式匹配算法,则需要将i回溯为1,即i=i-j+1,而j=0。

若用的是KMP模式匹配算法,i不需要回溯,只有j根据字符串B的具体情况回溯到相应位置。

KMP解决了朴素匹配模式算法中的i和j的回溯问题,提高了字符串匹配的效率


KMP算法主要分为两部份

第一部分为方法getNext(),其数组的元素为在对应字符不相等时j需要回溯到字符串B的相应位置

public void getNext(String str,int[] next){
		int i=0,j=-1;
		next[0] = -1;
		while(i<str.length()-1){
			if(j==-1||str.charAt(i)==str.charAt(j)){				
				i++;
				j++;
				next[i]=j;
			}else{
				j=next[j];
			}			
		}		
	}


第二部分为方法indexKMP(),相对应与朴素匹配算法,在判断条件中加了j==-1和i、j回溯方法的不同

public void indexKMP(String A,String B,int[] next){
		int i=0,j=0;
		while(i<A.length()&&j<B.length()){
			if(j==-1||A.charAt(i)==B.charAt(j)){
				i++;
				j++;
				
			}else{
				j=next[j];
			}
			
			
			
		}
		if(j>=B.length())
			System.out.println("查找成功");
		else
			System.out.println("该字符串不存在");
		
	}



总结

相对于朴素的模式匹配算法,KMP主要解决了就算上一轮的匹配不成功,也能为下一轮的匹配提供信息,使得i不用回溯,而j回溯到最合适的位置。

朴素的模式匹配算法的时间复杂度为((n-m+1)*m),而KMP提高为n+m

注:m为A的长度,n为B的长度








猜你喜欢

转载自blog.csdn.net/StarsionBlog/article/details/70186277
今日推荐