复习过程中看到的一个简洁明了的求取部分匹配值的方法,比看图要好理解。
字串结构上的几个概念:
前缀:指除最后一个字符外,字符串的所有头部字串。
后缀:指除第一个字符外,字符串的所有尾部子串。
部分匹配值:为字符串的前缀和后缀的最长相等前后缀长度。
以 ′ a b a b a ′ 'ababa' ′ababa′为例:
′ a ′ 的 前 缀 和 后 缀 都 为 ∅ , 最 长 相 等 前 后 缀 长 度 为 0 'a'的前缀和后缀都为\varnothing,最长相等前后缀长度为0 ′a′的前缀和后缀都为∅,最长相等前后缀长度为0
′ a b ′ 的 前 缀 为 { a } , 后 缀 为 { b } , { a } ∩ { b } = ∅ , 最 长 相 等 前 后 缀 长 度 为 0 'ab'的前缀为\{a\},后缀为\{b\},\{a\}\cap\{b\}=\varnothing,最长相等前后缀长度为0 ′ab′的前缀为{a},后缀为{b},{a}∩{b}=∅,最长相等前后缀长度为0
′ a b a ′ 的 前 缀 为 { a , a b } , 后 缀 为 { a , b a } , { a , a b } ∩ { a , b a } = { a } , 最 长 相 等 前 后 缀 长 度 为 1 'aba'的前缀为\{a,ab\},后缀为\{a,ba\},\{a,ab\}\cap\{a,ba\}=\{a\},最长相等前后缀长度为1 ′aba′的前缀为{a,ab},后缀为{a,ba},{a,ab}∩{a,ba}={a},最长相等前后缀长度为1
′ a b a b ′ 的 前 缀 为 { a , a b , a b a } ∩ 后 缀 { b , a b , b a b } = { a b } , 最 长 相 等 前 后 缀 长 度 为 2 'abab'的前缀为\{a,ab,aba\}\cap后缀\{b,ab,bab\}=\{ab\},最长相等前后缀长度为2 ′abab′的前缀为{a,ab,aba}∩后缀{b,ab,bab}={ab},最长相等前后缀长度为2
′ a b a b a ′ 的 前 缀 { a , a b , a b a , a b a b } ∩ 后 缀 { a , b a , a b a , b a b a } = { a , a b a } , 公 共 元 素 有 两 个 , 最 长 相 等 前 后 缀 长 度 为 3 'ababa'的前缀\{a,ab,aba,abab\}\cap后缀\{a,ba,aba,baba\}=\{a,aba\},公共元素有两个,最长相等前后缀长度为3 ′ababa′的前缀{a,ab,aba,abab}∩后缀{a,ba,aba,baba}={a,aba},公共元素有两个,最长相等前后缀长度为3
综上,字符串 ′ a b a b a ′ 'ababa' ′ababa′的部分匹配值为00123
部分匹配值的作用:将部分匹配值写成数组形式后可以得到next数组.