赞
踩
在数据结构中学习KMP算法,仅仅只是理解它的原理,但并没有它具体怎样通过代码实现,今天跟着卡哥学习了怎样用代码实现KMP算法,收获还是很大的。
首先,在使用KMP算法的时候,一定要先建立一个前缀表next[],前缀表依据代码的实现方式有三种形式,这里,主要讲其中一种。
创建前缀表主要由四步组成,依据这四步,可以轻松创建。
以下是代码部分:
private void getNext( String s , int[] next){ //一、初始化 int j = 0; next[0] = 0; for (int i = 1; i < s.length(); i++) { //二、不匹配 while (s.charAt(i) != s.charAt(j) && j>0) j = next[j-1]; //三、匹配 if( s.charAt(i) == s.charAt(j)) j++; //四、更新next next[i] = j; } }
在对文本串进行模式串的匹配的时候,其实就跟创建前缀表next[]基本完全一样,因为都是在找两处相等的字符串。区别是:
以下是代码部分,两个方法的代码基本相同:
public int strStr(String haystack, String needle) { //一、初始化 int[] next = new int[needle.length()]; int j =0; getNext(needle,next); for (int i = 0; i < haystack.length(); i++) { //二、不匹配 while ( haystack.charAt(i) != needle.charAt(j) && j>0) j = next[j-1]; //三、匹配 if(haystack.charAt(i) == needle.charAt(j)) j++; //四、判断j的大小 if( j == needle.length()) return i-j+1; } return -1; } private void getNext( String s , int[] next){ //一、初始化 int j = 0; next[0] = 0; for (int i = 1; i < s.length(); i++) { //二、不匹配 while (s.charAt(i) != s.charAt(j) && j>0) j = next[j-1]; //三、匹配 if( s.charAt(i) == s.charAt(j)) j++; //四、更新next next[i] = j; } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。