cdai在Accepted KMP solution in java for reference的评论中提供的题解。
// Similar to strStr except compare t against itselfprivateint[]computePrefixFunc(String t){int[] f &#61;newint[t.length()];for(int i &#61;1, j &#61;0; i < t.length(); i&#43;&#43;){// now i &#61; #matchedwhile(j >0&& t.charAt(i)!&#61; t.charAt(j)) j &#61; f[j -1];if(t.charAt(i)&#61;&#61; t.charAt(j)) j&#43;&#43;;f[i]&#61; j;}return f;}publicintstrStr(String s,String t){int[] f &#61;computePrefixFunc(t);int i, j;for(i &#61;0, j &#61;0; i < s.length()&& j < t.length(); i&#43;&#43;){// never back up iwhile(j >0&& s.charAt(i)!&#61; t.charAt(j)) j &#61; f[j -1];// back up j recursively till next char matchif(s.charAt(i)&#61;&#61; t.charAt(j)) j&#43;&#43;;// if matched move j, otherwise give up current i and move on}return j &#61;&#61; t.length()? i - j :-1;}