引用大佬的解释(目录为:扩展2,文中KMP讲解非常详细):https://blog.csdn.net/v_july_v/article/details/7041827
直接粘代码(只展示核心,边界值只做简单校验,鲁棒性没深究):
private static int sunday (char[] base, char[] model){
if (base.length == 0 || model.length == 0){
return 0;
}
Map<Character, Integer> strMap = getStrMap(model);
int i = 0, j = 0, count = 0, bl = base.length, ml = model.length;
while (i + ml - j <= bl){
if (base[i] == model[j] ){
i++;
j++;
if (j == ml){
i = i - j + 1;
j = 0;
count++;
}
} else {
if (i + ml - j >= bl){
break;
} else {
int shift = strMap.get(base[i + ml -j]) == null ? ml + 1 : strMap.get(base[i + ml -j]);
i += shift - j;
j = 0;
}
}
}
return count;
}
private static Map<Character, Integer> getStrMap(char[] str){
Map<Character, Integer> strMap = new HashMap<Character, Integer>();
int sl = str.length;
for (int i = 0;i < sl;i++){
strMap.put(str[i],sl-i);
}
return strMap;
}