先求出nextval数组:
//KMP-求nextval数组 private int[] getNextVal(String str){ int length = str.length(); int[] nextval = new int[length]; char[] strchar = str.toCharArray(); int j= 0; int k = -1; nextval[0] = -1; while (j < length-1){ if(k== -1 || strchar[j] == strchar[k] ){ j++; k++; if(strchar[j] != strchar[k]){ nextval[j] = k; }else { nextval[j] = nextval[k]; } }else { k = nextval[k]; } } return nextval; }
然后利用nextval数组查找位置:
//KMP-获取子字符串在字符串的位置 public int getKMPIndex(String string,String substring){ int i = 0; int j = 0; int[] nextval = getNextVal(substring); char[] stringCharArray = string.toCharArray(); char[] substringCahrArray = substring.toCharArray(); int stringlength = string.length() ; int substringlength = substring.length(); while (i < stringlength && j < substringlength){ if(j == -1 || stringCharArray[i] == substringCahrArray[j]){ i++; j++; }else { j = nextval[j]; } } if( j >= substringlength){ return i - substringlength; }else { return -1; } }