KMP算法NEXT数组纯手工生成

用一个实际的例子来说明,经历了看懂,看不懂,看懂,看不懂,看懂...后我终于决定把它记下来了。

例子字符串为:abaabaca

首先可以肯定,第一个位置永远位0,第二个位置永远为1.那么可以初始化如下表格:

abaabaca
01      
然后求上表中红色的a多对应的值:公式为(a前面的字符串中所有前缀字符与a前面的字符串中所有后缀自付中所有后缀字符相同的字符的最大中长度最长的长度)+1;

公式看起来很复杂,一步一步来说明:

首先是前缀字符和后缀字符,拿字符abcde来举例:

前缀字符有:a、ab、abc、abcd ;后缀字符有:e、de、cde、bcde;

由此可见前缀字符就是第一个字符、(第一个字符第二个字符)、... 、(第一个字符...第n-1个字符)

               后缀字符就是第n个字符、(第n-1个字符第n个字符)、... 、 (第二个字符...第n个字符)

在abcde中,前缀字符与后缀字符没有相同的字符串存在,所以最大的相同字符串的长度位0;

在回到上表中的红色的a,它前面的字符串为  ab  ;ab的前缀字符有 {a} ;后缀字符有{b},最大的相同字符串的长度为0,

根据公式,上表中红色的a对应的位置应当填入0+1=1;获得下表:

abaabaca
011     
下面求上表中红色a位置的值

 上表中红色a前面的字符串为 aba; 它的前缀字符串有 {a ,ab};后缀字符串有{a,ba};最大的相同字符串的长度为1(都有相同的元素a),根据公式,上表中红色的a对应的位置应当填入1+1=2;获得下表:

abaabaca
0112    
然后求上表中红色b位置的值

上表中红色b前面的字符串为 abaa;它的前缀字符串有{a , ab,aba};后缀字符串有{a,aa,baa};最大的相同字符串的长度为1(都有相同的元素a),根据公式,上表中红色的b对应的位置应当填入1+1=2;获得下表:

abaabaca
01122   
然后求上表中红色a位置的值

上表中红色a前面的字符串为 abaab;它的前缀字符串有{a,ab,aba,abaa};后缀字符串有{b,ab,aab,baab};最大的相同字符串的长度为2(都有相同的元素ab),根据公式,上表中红色a对应的位置应当填入2+1=3;获得下表:

abaabaca
011223  
然后求上表中红色c位置的值

上表中红色c前面的字符串为abaaba;它的前缀字符串有{a,ab,aba,abaa,abaab};后缀字符串有{a,ba,aba,aaba,baaba};最大的相同字符串的长度为3(都用相同的元素aba),根据公式,上表中红色a对应的位置应当填入3+1=4;获得下表:

abaabaca
0112234 
最后就是求上表中红色的a的值了,自己试试吧,答案选中下面的表格得见:

abaabaca
01122341


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/569213.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P1078 文化之旅

题面 这题好像是初二时老师讲过的一道题,但是。。我没听??反正没交过就对了。。 我本来想的是深搜spfa,写到50行实现不了??果断看tj,floyd???(黑人…

KMP算法中NEXT数组的作用以及代码实现

在http://blog.csdn.net/u012613903/article/details/79004094中写到了如何手工去求一个NEXT数组,这个在很多考试中可以用来解题。但是在实际的使用中,NEXT数组究竟发挥着什么样的作用,如何用代码实现KMP算法呢? KMP算法是用来确…

最长公共连续子串

给出两个字符串(可能包含空格),找出其中最长的公共连续子串,输出其长度。 注意这里是找连续子串。 算法:动态规划。f[i][j]表示第一个字符串前i个字符中与第二个字符串前j个中的最长连续子串长度 那么状态转移为:当s1(i)s2(j)时&a…

求最长回文串-从动态规划到马拉车之路(上)

要解决的问题: 给定一个字符串,要求求出这个字符串中的最长的回文串子串。 例子: cbddba的最长回文子串为 bddb cbdedba的最长回文子串为dbedb 由上面的例子可以看到,在考虑回文子串的问题时需要考虑奇偶性。因为奇回文关于中…

为什么Python中称__lt__、__gt__等为“富比较”方法

Python中基类object提供了一系列可以用于实现同类对象进行“比较”的方法,可以用于同类对象的不同实例进行比较,包括__lt__、__gt__、__le__、__ge__、__eq__和__ne__六个方法。 那么为什么叫“富比较”(“rich comparison”)方法呢?查了相关…

求最长回文串-从动态规划到马拉车之路(下)

预备知识&#xff1a; &#xff08;1&#xff09;在一个数轴上有两点i和j&#xff08;i<j&#xff09;关于点m对称&#xff0c;那么有 i 2m-j&#xff1b; 证明&#xff1a; 因为 i<j 且 i 和 j 关于 m 对称&#xff0c;那么有 &#xff08;i j&#xff09;/ 2 m 所…

项目管理实战之团队管理 (转自:zhuweisky)

一个系统不仅需要优秀的分析和设计&#xff0c;更需要一个良好的过程将其从蓝图转化为实现。这个过程中最重要的是对团队的管理&#xff0c;也就是人的管理。一个优秀的团队和一个糟糕的团队的效能是天壤之别&#xff0c;她们之间的比例不是1:100或1:1000这样量化的数字能够表示…

python3 内置方法

# -*- coding:utf-8 -*- # Author: Evan Mi import functools # 取绝对值 print(abs:, abs(-1)) # 如果一个可迭代对象的所有元素都为真&#xff0c;返回true ;空也返回真 print(all:, all([1, 0, -3])) # 有一个为真就全为真 print(any:, any([1, 0, -1])) # 变成可打印的字符…

JS 职责链模式

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title></head><script>/*职责链模式 所有对象依次处理请求&#xff0c;1不能处理传给2&#xff0c;2不能处理传给3....*//*场景 打折 100以下不打折&…

python3字符串常用操作

# -*- coding:utf-8 -*- # Author: Evan Miname "my name is alex"print(name.capitalize()) # 首字母大写 print(name.count("a")) # 统计整个字符中a的个数 print(aaaaa.count("a", 0, len(aaaaa)-1)) # 前闭后开 print(name.center(50, &…

通过NGINX location实现一个域名访问多个项目

location ~ \.php$ {   root /home/webroot; //此目录下有多个项目 project1 &#xff0c;project2...   fastcgi_pass $php_upstream;   fastcgi_index index.php;   include fastcgi.conf; } location ~/project1 {   index index.php;   fastcgi_pass $php_u…

python3 set相关操作

# -*- coding:utf-8 -*- # Author: Evan Mi# 创建一个set list_1 [1, 3, 5, 7, 3, 6, 7, 9] list_1 set(list_1) list_2 set([2, 6, 0, 66, 22, 8, 4]) print(list_1, type(list_1))# 交集 print(list_1.intersection(list_2)) print(list_1 & list_2) # 并集 print(lis…

JDK环境变量

下载打开如下链接&#xff1a;http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html &#xff0c;进入JDK1.8下载官网&#xff0c;或者直接百度JDK1.8&#xff0c;也可进入下载官网。 进入官网后&#xff0c;按照所给信息下载对应系统版本的J…

python3字典相关方法

# -*- coding:utf-8 -*- # Author: Evan Miinfo {stu1101: TengLan Wu,stu1102: LongZe Luola,stu1103: XiaoZe Maliya } # 字典是无序的 print(info) print(info[stu1101]) # 不存在会报错 print(info.get(stu1101)) # 不存在返回None print(stu1103 in info) # 判断是否…

Shadow Defender 语言文件并注册

:: ::关闭回显 echo off ::设置标题 title 覆盖 Shadow Defender 语言文件并注册:: ::获取管理员权限 set "_FilePath%~f0" set "_FileDir%~dp0" setlocal EnableExtensions EnableDelayedExpansion fltmc >nul 2>&1 || (echo Set UAC CreateOb…

python3 列表相关操作

# -*- coding:utf-8 -*- # Author: Evan Mi import copynames ["ZhangYang", "Guyun", "XiangPeng", "XuliangChen"] #创建一个列表 names.append("LeiHaiDong") # 给列表的末尾追加元素 names.insert(1, "ChenRongHu…

NickLee 多層菜單

void InitMenu(){ //初始化菜單 MenuItem menuFirst; DataSet dsPermit; UserInfo ui ; DataSet dsFfunc.GetDataTable("select * from cqsSystemTree where F_Parent000 and isValid1 order by showSort"); foreach (DataRow myrow in dsF.Tables[0].Rows…

python3 生成器

要说生成器&#xff0c;就必须首先要知道列表的概念&#xff1b; 我们创建一个如下的列表&#xff1a; ls [1,2,3,4,5,6,7,8,9] 那么就开辟了一个门牌号为ls的内存区&#xff0c;然后真的把1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5&#xff0c;6&#xff0c;7&…

递归 与 动态规划 区别

递归 &#xff1a; 后面的子问题由前面的子问题解来表示 f(n) _f(n-1) f(n-2)等来表示 动态规划&#xff1a;前面的解由后面的子问题解来选择&#xff0c;自底向上&#xff0c;后面的解层层向前 得到最前的解。 key&#xff1a;找到dp[n] 与 dp[n-1]的联系&#xff0c;也就…

python3 文件相关操作

# -*- coding:utf-8 -*- # Author: Evan Mi""" data open("E:/pythondata/day02/yesterday.txt").read() print(data) """ # r是读模式&#xff0c;找不到文件会报错 r 在读的基础上有了写的能力&#xff0c;这里的写就是追加 # w是…