KMP算法实现
来源:互联网 发布:免费行业报告下载知乎 编辑:程序博客网 时间:2024/06/16 14:38
import java.util.Scanner;//KMP算法, T(n)=O(N+M)public class Main{ public static void main(String []args){ Scanner sc=new Scanner(System.in); String s=sc.nextLine(); String t=sc.nextLine(); System.out.println(KMPIndex(s, t)); } public static int[] getNext(String t){ if(t.length()==1){ return new int[]{-1}; } int next[]=new int[t.length()]; next[0]=-1;//初始为-1 next[1]=0;//初始为0 int pos=2;//指向next的当前位置 int cn=0;//记录当前位置最大前后缀数目 while(pos<t.length()){ if(t.charAt(pos-1)==t.charAt(cn)){//i-1位置字符等于前缀的后一个字符,next[i]=next[i-1]+1 next[pos++]=++cn; }else if (cn>0) { cn=next[cn];//cn>0,依次从左找最长匹配前缀。 }else { next[pos++]=0; } } return next; } public static int KMPIndex(String s,String t){//返回第一个匹配的下标,若不匹配,返回-1 if(s.length()<t.length()){ return -1; } int next[]=getNext(t);//得到next数组 int i=0,j=0; while(i<s.length()&&j<t.length()){ if(j==-1||s.charAt(i)==t.charAt(j)){//j==-1是当第一个都不匹配的情况下,j也要++ i++; j++; }else { j=next[j];//相当于将t字符串右移动到后缀匹配最大的位置的下一个字符。从这个字符开始比较 } } if(j>=t.length()){//得到第一个开始匹配的下标 return (i-t.length()); }else { return -1; } } }
阅读全文
1 0
- KMP算法及改进KMP算法实现
- [数据结构]KMP算法实现
- KMP算法的实现
- KMP算法实现
- KMP算法实现
- KMP 算法实现
- kmp算法实现
- KMP算法实现
- KMP算法和实现
- KMP算法实现
- KMP算法及实现
- KMP算法的实现
- KMP算法实现
- java实现kmp算法
- KMP算法C++实现
- KMP算法c++实现
- KMP算法java实现
- kmp算法实现
- ListView的多条目加载
- SDL2入门教程(02_Getting an Image on the Screen)
- Chrome学习笔记(一):线程模型,消息循环
- dll->mdb
- 1013. 数素数 (20)
- KMP算法实现
- java 对象new的理解
- Android进程间(IPC机制)通信(Bundler,Messenger,AIDL,ContentProvider)
- 单例模式
- 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
- Mybatis传参与返回值
- SSM框架搭建简单的前后台分离项目(前台篇)
- Mybaits根据数据库表自动生成entity,dao,mapper相关配置文件
- 报数—循环链表