您的位置:首页 > 编程语言 > Java开发

KMP算法java实现

2013-04-07 14:53 351 查看
从昨晚开始一直在研究KMP算法 其主要思想比较简单 但是要实现起来比较麻烦 并且网上关于KMP的实现的讲解众说纷纭 本文主要参考了我转载的上一篇文章 KMP字符串模式匹配详解 精华 中的第一种方法 将其对应的KMP算法进行了实现

/**
* KMP算法 java 实现
* @author admin
*
*/
public class KMP {

/**
* 求与patten字符数组中每个字符对应的next值 存于next数组中
* @param patten	要匹配的字符串
* @param next	next数组
*/
static void get_nextval(char[] patten, int[] next)
{
int j = 0; //patten数组下标
int k = -1;
next[0] = -1;
while(j<patten.length-1)
{
if((k==-1) || (patten[j]==patten[k]))
{
k++;
j++;
if(patten[j] != patten[k])
next[j] = k;
else
next[j] = next[k];
}
else
k = next[k];
}
}

/**
* 设在字符串S中查找模式串T,若S[m]!=T
,那么,取T
的模式函数值next
,
*1. next
= -1 表示S[m]和T[0]间接比较过了,不相等,下一次比较 S[m+1] 和T[0]
*2. next
=0 表示比较过程中产生了不相等,下一次比较 S[m] 和T[0]。
*3. next
= k >0 但k<n, 表示,S[m]的前k个字符与T中的开始k个字符已经间接比较相等了,下一次比较S[m]和T[k]相等吗?
*4. 其他值,不可能。

* @param test 被匹配的字符串
* @param patten 模式串
* @return
*/
static int kmp(char[] test, char[] patten)
{
if(test.length==0 || patten.length==0)
return -1;
int len = patten.length;
int[] next = new int[len+1];
get_nextval(patten, next);

int index = 0;
int i = 0;
int j = 0;
while(i<test.length && j<patten.length)
{
if(test[i] == patten[j])
{
i++;
j++;
}
else
{
index += j-next[j];
if(next[j] != -1)
j = next[j];
else
{
j = 0;
i++;
}
}
}
if(j>=patten.length)
return index;
else
return -1;

}

public static void main(String[] args)
{
String testStr = "bababcadbdafdsaf";
String patStr = "adb";
char[] test = testStr.toCharArray();
char[] patten = patStr.toCharArray();
int pos = kmp(test, patten);
System.out.println(pos);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: