其实还没开始学就知道了,硬背下来用会比理解的性价比多得多(つд⊂)但是还是试着理解了一下吧。
特点就是源串不需要回溯到比较失败的开头字符的下一个。
由此产生的疑惑是“不会漏掉正确答案吗”。
如果有答案,使用KMP找到答案前,源串某轮比较失败的结果有两种情况:答案还在后面;包括了答案的前面一部分,在末尾截断了(包含答案后一部分不可能)。
第一种情况不回溯毫无影响,所以要考虑的就是第二种。而next数组就是用来定位这个“前面一部分”在哪。
很多时候即使定位了可能紧接着下一个就又是断的,然后直接跳到下一个比。
每个都要挨个算出来是因为从哪里截断都有可能。
明明是要分析源串、却逮着模式串计算next数组是因为在一轮失败的比较里,比较过的源串和模式串内容完全相同,分析模式串也就是分析了源串。
模式串有“aaaa”这种重复的开头如果匹配失败,会导致卡在这进行几轮无意义的次数呈等差数列的比较是因为,系统只会想到这一步:“aaaa对了,那源串后面的aaa和模式串前面的aaa就是对应的”,不会明白 由于源串下一个是b,所以一堆a怎么凑也不会有正确答案 的道理。
至于相应的nextvalue还是死记硬背吧(;´ヮ`)7说白了我上面那个解释虽然说得通但总结得完全不够典型。也就是说一知半解。