clinton homer riemann marjorie
0 rie 3解题思路:这是很典型的字符串匹配,我们使用KMP算法进行解题,先求出模式串的next[]函数,然后用kmp函数结合next[]函数解题,kmp函数返回一个整型数,然后对这个数进行判断,最后输出相匹配的字符串和长度(即kmp返回的数)。注意:本体采用java编写,所以特别初一超时和超内存问题。(1):直接对字符串进行操作,不用转换成别的类型;(2)输出的时候不能用for输出,不然绝对超内存,要用str.substring(int index,int length)函数进行输出。代码实现:(1):next函数static int[] getnext(){ //getnext函数,获得next[]数组的值 int i=0,j=-1; next[0]=-1; while(i<strs.length()){ if(j==-1||strs.charAt(i)==strs.charAt(j)) /* 特别注意:j==-1必须在前,不然后面的语句可能会挂掉, 需要在挂掉之前必须跳出if,或者出现越界的错误。 */ { //满足匹配或者j(即上个循环的next[j]的值)的值为-1, i++; j++; next[i]=j; //把j的值赋值给next[i] } else j=next[j]; //寻找j的所在位置的next值 } return next; }
(2):kmp函数static int kmp(){ int i=0,j=0; while(i<strt.length()&&j<strt.length()) { if(j==-1||j<strs.length()&&strs.charAt(j)==strt.charAt(i)) /* 特别注意:j==-1语句和j<strs.length()语句必须在前, 不然后面的strs.charAt(j)==strt.charAt(i)语句可能会挂掉, 需要在挂掉之前必须跳出if,或者出现越界的错误。 */ { i++; j++; } else j=next[j]; //匹配失败,j不回0,而是跳到next[j]所在位置继续匹配,这正是KMP算法比普通算法优化的地方 } return j; }完整代码:import java.util.Scanner; class Main{ static String strs; static String strt; static int[] next=new int [50001]; public static void main(String agrs[]){ Scanner sc=new Scanner(System.in); while(sc.hasNext()){ strs=sc.nextLine(); strt=sc.nextLine(); getnext(); int m=kmp(); if(m==0) System.out.println("0"); else { System.out.println(strs.substring(0,m)+" "+m); //使用strs.substring()函数,优点是为了防止超内存 } } } static int[] getnext(){ //getnext函数,获得next[]数组的值 int i=0,j=-1; next[0]=-1; while(i<strs.length()){ if(j==-1||strs.charAt(i)==strs.charAt(j)) /* 特别注意:j==-1必须在前,不然后面的语句可能会挂掉, 需要在挂掉之前必须跳出if,或者出现越界的错误。 */ { //满足匹配或者j(即上个循环的next[j]的值)的值为-1, i++; j++; next[i]=j; //把j的值赋值给next[i] } else j=next[j]; //寻找j的所在位置的next值 } return next; } static int kmp(){ int i=0,j=0; while(i<strt.length()&&j<strt.length()) { if(j==-1||j<strs.length()&&strs.charAt(j)==strt.charAt(i)) /* 特别注意:j==-1语句和j<strs.length()语句必须在前, 不然后面的strs.charAt(j)==strt.charAt(i)语句可能会挂掉, 需要在挂掉之前必须跳出if,或者出现越界的错误。 */ { i++; j++; } else j=next[j]; //匹配失败,j不回0,而是跳到next[j]所在位置继续匹配,这正是KMP算法比普通算法优化的地方 } return j; } }
原文:http://blog.csdn.net/xionghui2013/article/details/45000645