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

java实现kmp算法

2011-04-29 22:00 513 查看
//kmp.java
/**
*@author feixiang KMP算法
*待查的字符和next数组都是从0号单元开始的
*next数组的第一个是-1 即为如果要比较的下一个是带比较串的第-1个,就要移动原串了
*多走一步得-1才能知道前面没有了
*/
package first;

public class kmp{
public static void main(String[] args)
{
String a = "aaabcabcdeadfskdljfa;lskjdf;kljsdkjfeilskjf";
String b = "abcabcde";
int c = kmp_find(a,b,0);
System.out.println(c);
}
static int[] GetNext(String fidStr)
{
int len = fidStr.length();
int next[] = new int[len];
int j = -1, i = 0;
next[0] = -1;
while(i < len-1)//这里这个减1是必要的,因为i关系到了要算出next的前一个
{
if(-1 == j || fidStr.charAt(j) == fidStr.charAt(i))
{
++i; ++j;
if(fidStr.charAt(j) == fidStr.charAt(i))
next[i] = next[j];
else
next[i] = j;
}
else
{
j = next[j];
}
}
return next;
}
static int kmp_find(String SurStr, String FidStr, int pos)
{
int next[] = GetNext(FidStr);
int j = 0;
int i = pos;
while(j < FidStr.length() && i < SurStr.length()-FidStr.length()+1)
{
if(-1 == j || FidStr.charAt(j) == SurStr.charAt(i))
{
j++; i++;
}
else
{
j = next[j];
}
}
if(j == FidStr.length())
{
return i-FidStr.length();
}
else
{
return -1;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: