/**<br /> *<br /> */<br />package com.baseframework;</p><p>/**<br /> * @author sunyanan KMP演算法<br /> *<br /> */<br />public class KMPAlgorithm {</p><p>/**<br /> * 計算模式串的next函數<br /> *<br /> * @param desStr<br /> * 模式串<br /> * @return 模式串的next函數,用數組來儲存<br /> */<br />private static int[] kmpNext(String desStr) {<br />int len = desStr.length();<br />int i = 0;<br />int j = -1;<br />int next[] = new int[len];<br />while (i < len - 1) {<br />if (j == -1 || (desStr.charAt(i) == (desStr.charAt(j)))) {<br />i++;<br />j++;<br />if (desStr.charAt(i) != (desStr.charAt(j))) {<br />next[i] = (j + 1);<br />} else {<br />next[i] = next[j];<br />}<br />} else {<br />j = (next[j] - 1);<br />}<br />}<br />return next;</p><p>}</p><p>/**<br /> * kmp的核心演算法<br /> *<br /> * @param sourceStr<br /> * @param desStr<br /> * @param pos<br /> * 從主串的第幾個字元開始匹配<br /> * @return 成功的話返回位置,失敗的話返回-1,索引從0開始的<br /> */<br />public static int index(String sourceStr, String desStr, int pos) {<br />int next[] = kmpNext(desStr);<br />int i = 0;<br />int j = 0;<br />while (i < sourceStr.length() - 1 && j < desStr.length() - 1) {<br />if (j == 0 || (sourceStr.charAt(i) == desStr.charAt(j))) {<br />i++;<br />j++;<br />} else<br />j = (next[j] - 1);<br />}<br />if (j > desStr.length() - 2) {<br />return (i - desStr.length() + 1);<br />} else<br />return -1;</p><p>}</p><p>}<br />