KMP算法Java实现
2008-03-30 11:07
567 查看
public class KMP {
public static int[] next(char[] s)
{
int length = s.length;
int next[]=new int[length];
next[0]=-1;
next[1]=0;
for(int i=2;i<length;i++)
{
/*如果当前所求的数的前一位和他的next[]位相等的话,那么当前所求的位的next数就是它的前一位的next[]再加1*/
int temp = next[i-1];
while(temp!=-1&&s[i-1]!=s[temp])
{
temp = next[temp];
}
if(temp==-1) next[i] = 0;
else next[i] = temp+1;
}
return next;
}
public static int compare(char[] t, char[] s)
{
int tlen = t.length;
int slen = s.length;
int [] next = next(s);
int i,j;
for(i=0,j=0;i<tlen-slen&&j<slen;)
{
if(t[i]==s[j]){
i++;j++;
}else{
j=next[j];
if(j==-1)
{
i++;j++;
}
}
}
if(j<slen) return -1;
else return i;
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
char s[] = "abab".toCharArray();
char t[] = "zhangabliababling".toCharArray();
int temp = compare(t,s);
System.out.println(temp);
}
}
public static int[] next(char[] s)
{
int length = s.length;
int next[]=new int[length];
next[0]=-1;
next[1]=0;
for(int i=2;i<length;i++)
{
/*如果当前所求的数的前一位和他的next[]位相等的话,那么当前所求的位的next数就是它的前一位的next[]再加1*/
int temp = next[i-1];
while(temp!=-1&&s[i-1]!=s[temp])
{
temp = next[temp];
}
if(temp==-1) next[i] = 0;
else next[i] = temp+1;
}
return next;
}
public static int compare(char[] t, char[] s)
{
int tlen = t.length;
int slen = s.length;
int [] next = next(s);
int i,j;
for(i=0,j=0;i<tlen-slen&&j<slen;)
{
if(t[i]==s[j]){
i++;j++;
}else{
j=next[j];
if(j==-1)
{
i++;j++;
}
}
}
if(j<slen) return -1;
else return i;
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
char s[] = "abab".toCharArray();
char t[] = "zhangabliababling".toCharArray();
int temp = compare(t,s);
System.out.println(temp);
}
}
相关文章推荐
- java中提示这样的错误 java.awt.AWTError: BoxLayout can't be shared
- XP下JDK1.4安装与环境配置完全图解
- java 如何对自定义的对象进行排序
- java 如何对自定义的对象进行排序
- 失败啊失败,玩Java这么久,今天才下载了她的文档
- Eclipse使用秘籍(绝对经典)
- Eclipse使用入门
- 解析Java中的类和对象的初始化过程
- struts 中文乱码问题
- java lucene 技术 (2) :分词器
- java采集网址正则表达式练习一
- Java文字图像识别(1)
- Java加密和数字签名编程
- java socket编程
- java正则表达式
- 深入Java的equals方法
- Java IO Stream 总结
- Java如何调用可执行文件和批处理命令
- Java开发过程中经常碰到数据类型的问题
- 为什么要设置JAVA_HOME、Path、CLASSPATH、CATALINA_HOME