KMP算法中的next数组求解

        KMP算法(Knuth-Morris-Pratt) 是一个字符串的匹配算法,其中有一部分算法需要求解next数组来求解该位置前面字符串的最长相同的真前缀和真后缀长度。

        next数组的求解方法为:第一位的next值为0,第二位的next值为1,后面求解每一位的next值时,根据前一位进行比较。首先将前一位与其next值对应的内容进行比较,如果相等,则该位的next值就是前一位的next值加上1;如果不等,向前继续寻找next值对应的内容来与前一位进行比较,直到找到某个位上内容的next值对应的内容与前一位相等为止,则这个位对应的值加上1即为需求的next值;如果找到第一位都没有找到与前一位相等的内容,那么需求的位上的next值即为1。
 

         还是有点难看懂,举个例子:求解模式串 "ababaaabbaa "的next数组,首先先画一个表格便于观察其中的奥秘。在这之前我们要知道模式串中前两个位的next值分别为0,1。

                 先为模式串构建这样一张表,其中第一位和第二位的next值先填入0和1,接下来计算第三位(即下标为3的数据'a')的next值。

        第三位:首先看第三位的前一位即第二位的值(在上面的例子中,这个值为'b'),然后再看第二位的next值,该next值作为下标值找到对应的元素,比较第二位的值是否和这个下标对应的值相等,可以看出第二位的next值对应的值是'a',显然a不等于b,而a的next值已经没有对应的下标元素了,即已经没有下标为0的元素了,因此第三位的next值为1(如果找到最前面也没有找到相等的元素那么所求的next值就为1)。

 

         第四位:和第三位的求解方法一样,先看第四位的前一位即第三位的值为a,再将第三位的next值作为下标值对应到表中找出对应的元素,比较该元素是否与第四位的前一位的元素相同,如果相同那么第四位的next值就是前一位的next+1。显然第三位的next值作为下标对应的值也为a,两者相等,因此第四位的next值为第三位的next值+1=2。

        第五位:和之前的方法一样,将第四位的next值作为下标值找对应的值来与第四位的值(a)相比是否相等,正好,第四位next值对应的下标的元素也是b,所以第五位的next值为第四位的next值+1=3。

 

        第六位:相同的方法,将第五位的next值作为下标找到对应的元素,比较是否与第五位的值相等,很凑巧,也相等,所以第六位的next值为第五位的next值+1=4。

 

        第七位:将第六位的next值(4)作为下标值找到对应的值,这次发现第六位的值是'a',但是下标为4对应的值是'b',两者不相等,所以再将下标为4的next值(2)再作为下标值找对应的值,再比较是否和第六位的值相等,显然下标为2的值还是'b',与第六位的'a'不相等,因此再将下标为二的next值再作为下标值比较对应的值是否与第六位的值相等,这次发现下标为1的值和第六位相等了,所以第七位的next值就等于第二位的next值+1=2,因为最后是从第二位的next值找到第一位的。也可以看作是第七位的next值等于第一位的 下标值+1。

 

        第八位:将第七位的next值作为下标找到对应的值2,与第七位的值'a'做比较,发现不相等,于是将第二位的next值作为下标找到对应值,两者相等都为a,所以第八位的next值=第二位的next值+1=2。

 

         第九位:将第八位的next值作为下标值找到对应的值,比较是否与第八位的值相等,这次发现相等了,因为第八位的next值(2)作为下标对应的值也是b,因此第九位的next值=第八位的next值+1=3。

         第十位:将第九位的next值作为下标找到对应的值,再比较,发现两者都为a,因此第九位的next值=第八位的next值+1=4。

        第十一位:将第十位的next值作为下标找到对应的值进行比较,发现两者相等,因此第十一位的next=第十位的next+1=5。

 

        第十二位: 将第十一位的next值作为下标找到对应的值进行比较,发现两者相等,因此第十二位的next=第十一位的next+1=6。

         所以该字符串的next数组为:011234223456

### PyCharm 打开文件显示不全的解决方案 当遇到PyCharm打开文件显示不全的情况时,可以尝试以下几种方法来解决问题。 #### 方法一:清理缓存并重启IDE 有时IDE内部缓存可能导致文件加载异常。通过清除缓存再启动程序能够有效改善此状况。具体操作路径为`File -> Invalidate Caches / Restart...`,之后按照提示完成相应动作即可[^1]。 #### 方法二:调整编辑器字体设置 如果是因为字体原因造成的内容显示问题,则可以通过修改编辑区内的文字样式来进行修复。进入`Settings/Preferences | Editor | Font`选项卡内更改合适的字号大小以及启用抗锯齿功能等参数配置[^2]。 #### 方法三:检查项目结构配置 对于某些特定场景下的源码视图缺失现象,可能是由于当前工作空间未能正确识别全部模块所引起。此时应该核查Project Structure里的Content Roots设定项是否涵盖了整个工程根目录;必要时可手动添加遗漏部分,并保存变更生效[^3]。 ```python # 示例代码用于展示如何获取当前项目的根路径,在实际应用中可根据需调用该函数辅助排查问题 import os def get_project_root(): current_file = os.path.abspath(__file__) project_dir = os.path.dirname(current_file) while not os.path.exists(os.path.join(project_dir, '.idea')): parent_dir = os.path.dirname(project_dir) if parent_dir == project_dir: break project_dir = parent_dir return project_dir print(f"Current Project Root Directory is {get_project_root()}") ```
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值