package algorithm.advanced01; /** * @author mood321 * @date 2019/11/15 0:36 * @email [email protected] * å符æ¯å¦å¹é kmpç®æ³ æè·¯é½å¨ç¬è®°é è®°å¾ç ä¸ç¶å¿äºåºè¯¥ç䏿 */ public class KMP { public static int[] getNextArray(char[] s) { if (s.length == 1) return new int[]{1}; int[] next = new int[s.length]; next[0] = -1; next[1] = 0; int i = 2; // èµ°å°å符ä½ç½® int cur = 0; // é»è®¤æå¨å符æé¿åç¼ ä½æ¥è¯¢çæ¶å æ¯å¨æåæ° while (i < s.length) { // 1 æ¿å°next[i-1]çå¼ i-1çæé¿åç¼ è®°ä¸ºcur çstr[cur] ä¸str[i] æ¯å¦ç¸ç if (s[i - 1] == s[cur]) { // 2 ç¸ç next[i]çäº next[i]+1 ç»æ next[i++] = ++cur; } else { if (next[cur] > 0) { //3 ä¸ç¸ç æ¥å°next[next[i]] è®°æé¿åç¼æå¨çå符çä½ç½® 记为cur æ¿å°curçæé¿åç¼ æµç¨å1,2 ä¸è´ cur = next[cur]; } else { //4 妿ä¸ç´ä¸ç æ¥å°0ä½ç½® é£next[i]=0 next[i++] = 0; } } } return next; } // KMP public static int indexOf(String s1, String s2) { if (s1 == null || s2 == null || s2.length() > s1.length() || s1.length() == 0 || s2.length() == 0) { return -1; } char[] s1Arr = s1.toCharArray(); char[] s2Arr = s2.toCharArray(); int[] nextArray = getNextArray(s2Arr); int m1 = 0; // s1 å¤ææ¶ æå¨ä½ç½® æç»å¢é¿ int m2 = 0; // s2 å¤ææ¶ æå¨ä½ç½® å¤çæ¶å¨æåå æ¥å°ä¸ä¸ªå ç´ æ¶ ä¸å®ä»åä¸ä¸ªå ç´ çæé¿åç¼çä¸ä¸ä¸ªå ç´ while (m1 < s1Arr.length && m2 < s2Arr.length) { if (s1Arr[m1] == s2Arr[m2]) { // 夿s1ä¸m1 æå¨å ç´ å s2 ä¸m2 æ¯å¦ç¸ç ç¸å é½åç§» m1++; m2++; } else if (nextArray[m2] == -1) { // ä¸ç¸ç s2 ä¸m2 å¨0ä½ç½® s1 åç§» m1++; } else { // ä¸ç¸ç s2ä¸m2 ä¸å¨0ä½ç½® å 为æé¿åç¼ååç¼ç¸ç æä»¥æ¤æ¶ s1 ä¸m1 åé¢å符ä¸å®å s2çm2çæé¿åç¼ç¸ç // è°æ´è®©m2æ¥å° æé¿åç¼çä½ç½® ç»§ç»while m2 = nextArray[m2]; } } // 妿m2 æ¥å°s2 æå 说æå ¨é¨å¹é ç»æå°±æ¯s1 å½åä½ç½®m1åå»s2çé¿åº¦(è¿æ¶é¿åº¦å°±æ¯m2) //没æ¥å°æå è¯´ææ²¡å¹é ä¸ -1 return m2==s2Arr.length?m1-m2:-1; } public static void main(String[] args) { System.out.println(indexOf("abv1231awewqeqweqweqeqa","123")); } }