KMP算法JAVA的实现
- public?class?KMP?{ ?????? ??????private?String?text; ??????private?String?pattern; ?????? ??????KMP()?{ ?????????? ??????} ?????? ??????KMP(String?text,?String?pattern)?{ ??????????this.text?=?text; ??????????this.pattern?=?pattern; ??????} ?????? ??????public?void?setText(String?text)?{ ??????????this.text?=?text; ??????} ?????? ??????public?void?setPattern(String?pattern)?{ ??????????this.pattern?=?pattern; ??????} ?????? ??????public?void?KMPMatcher()?{ ??????????int?n?=?text.length(); ??????????int?m?=?pattern.length(); ?????????? ??????????int?prefix[]?=?computePrefix(); ??????????int?q?=?0; ?????????? ??????????int?count?=?0; ??????????for(int?i?=?0;?i?<?n;?i++)?{ ?????????????? ??????????????while(q?>?0?&&?pattern.charAt(q)!=?text.charAt(i))?{ ??????????????????q?=?prefix[q?-1]; ??????????????} ?????????????? ??????????????if(pattern.charAt(q)?==?text.charAt(i)) ??????????????????q++; ?????????????? ??????????????if(q?==?m)?{ ??????????????????System.out.println("Pattern?occurs?with?shift??"?+?++count?+?"times"); ??????????????????q?=?prefix[q?-?1]; ??????????????} ??????????} ?????????? ??????????if(count?==?0)?{ ??????????????System.out.println("There?is?no?matcher!"); ??????????} ??????} ?????? ??????private?int[]?computePrefix()?{ ??????????int?length?=?pattern.length(); ??????????int[]?prefix?=?new?int[length]; ?????????? ??????????prefix[0]?=?0; ?????????? ??????????int?k?=?0; ??????????for(int?i?=?1;?i?<?length;?i++)?{ ??????????????while(k?>?0?&&?pattern.charAt(k)?!=?pattern.charAt(i))?{ ??????????????????k?=?prefix[k?-1];? ??????????????} ??????????????if(pattern.charAt(k)?==?pattern.charAt(i)) ??????????????????k++; ??????????????prefix[i]?=?k; ??????????} ?????????? ??????????return?prefix; ??????} ?????? ??????public?static?void?main(String[]?args)?{ ?????????? ??????????KMP?kmp; ?????????? ??????????if(args.length?==?2)?{ ??????????????kmp?=?new?KMP(args[0]?,?args[1]); ??????????} ??????????else?{ ??????????????kmp?=?new?KMP(); ??????????????kmp.setText("ababacabacbababababacabcbabababaca"); ??????????????kmp.setPattern("ababaca"); ??????????} ?????????? ??????????kmp.KMPMatcher(); ?????????? ??????} ??