diff --git a/Data-Structrue/5-string.md b/Data-Structrue/5-string.md index fb65048..cfcc5c7 100644 --- a/Data-Structrue/5-string.md +++ b/Data-Structrue/5-string.md @@ -60,6 +60,8 @@ $KMP$算法是对朴素模式匹配算法的优化。 但是我们一眼就能看出来$2$这个位置不需要进行对比,因为我们之前匹配过,字符串中只有最开始位置为$1$,其他位置都不为$1$,所以应该直接跳到没有对比的主串位置进行对比,而不是重复对比之前的内容。这是我们大脑默认处理的过程,$KMP$就是模拟这个处理过程。 +主串是未知的,而模式串是已知的,所以对于串匹配的优化必然基于模式串。 + 由于模式串在最开始就是已知的,所以在失配前主串和模式串必然相等,即我们可以选择模式串中能匹配的部分重新匹配,而不是直接从头开始。 #### 公共前后缀 @@ -89,7 +91,7 @@ $KMP$算法是对朴素模式匹配算法的优化。 #### next数组 -失配移动位数$move$=已匹配字符数$j-1$-对应的部分匹配值$PM[j-1]$。(从而跳到开始有重复公共前缀的地方) +失配移动位数$move$=已匹配字符数$(j-1)$-对应的部分匹配值$PM[j-1]$。(从而跳到开始有重复公共前缀的地方) 部分匹配值表就是子串应该跳转的索引值。当这个位失配,则子串应该跳转的索引值是失配位置前一位的$PM$值。