字符串匹配算法KMP Java实现

看了一些的kmp实现,依葫芦画瓢,很死板,前缀什么的完全没必要。

kmp算法的核心思想:先对搜索字串生成偏移对照表,匹配时从左向右依次比较(bm从右向左,号称比kmp更快),相等则文档和搜索字串的下标+1迭代,否则查表,定位最优的偏移位置(文档下标不变,搜索字串下标改变)。例外是,字符不匹配时,若搜索字串的下标为0,则文档的下标+1,继续迭代比较。

import java.util.Arrays;

public class KMPSearch {
	public static int[] table;
	public static void generateTab(String key){//查询字串生成偏移对照表,一次迭代就可以
		int len=key.length();
		table=new int[len];
		Arrays.fill(table, 0);
		
		for(int i=1;i<len;i++){
			if(key.charAt(i)==key.charAt(table[i-1])){
				table[i]=table[i-1]+1;
			}
		}
		for(int v : table){
			System.out.print(v);
		}
		System.out.println();
	}
	public static int KMPSearchs(String doc,String key){
		generateTab(key);
		int result=-1;
		int doc_size=doc.length(),
			key_size=key.length(),
			doc_iter=0,
			key_iter=0;
		while(doc_iter<doc_size){//遍历所查询的文档,同样,单层循环就可以实现→_→
			if(doc.charAt(doc_iter)==key.charAt(key_iter)){
				doc_iter++;
				key_iter++;
			}else{
				if(key_iter==0){
					doc_iter++;
					continue;
				}else{
					key_iter=table[key_iter-1];
					continue;
				}
			}
			if(key_iter==key_size){
				result=doc_iter-key_size;
				break;
			}
		}
		return result;
	}
	public static void main(String[] args){
		int i=KMPSearchs("bbc abcdab abcdabcdabde","abcdabd");
		System.out.println(i);
	}
}


算法讲解参考http://itindex.net/detail/45421-%E5%AD%97%E7%AC%A6%E4%B8%B2-%E5%8C%B9%E9%85%8D-kmp

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。