赞
踩
public class KMP { public static void main(String[] a) { StringBuilder s1, s2; for(int i=0; i<1000; i++) { s1 = randomStr(3); s2 = randomStr(10); if((s2.indexOf(s1.toString()) != -1) && !match(s1.toString(), s2.toString())) { System.out.println("error"); System.out.println("s1:" + s1); System.out.println("s2:" + s2); System.out.println(); return; } } System.out.println("success"); } public static StringBuilder randomStr(int n) { StringBuilder stringBuilder = new StringBuilder(); for(int i=0; i<n; i++) { char c = (char)('a' + (int) (Math.random()*26)); stringBuilder.append(c); } return stringBuilder; } public static int[] getNextArr(String s) { if(s == null || s.length() == 0) return new int[0]; if(s.length() == 1) return new int[]{-1}; if(s.length() == 2) return new int[]{-1, 0}; int[] next = new int[s.length()]; next[0] = -1; next[1] = 0; for(int i=2, j=0; i<s.length(); i++) { j = i-1; while(next[j]>-1 && s.charAt(i-1) != s.charAt(next[j])) { j = next[j]; } next[i] = next[j] + 1; } return next; } public static boolean match(String s1, String s2) { int[] next = getNextArr(s1); for(int i=0, j=0; j<s2.length(); ) { if(s1.charAt(i) == s2.charAt(j)) { i++; j++; if(i == s1.length()) return true; } else { i = next[i]; if(i == -1) { i = 0; j++; } } } return false; } }
string的split方法
n^2级别的算法
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。