String Knuth-Morris-Pratt算法中的模式前缀函数计算

String Knuth-Morris-Pratt算法中的模式前缀函数计算,string,algorithm,substring,knuth-morris-pratt,String,Algorithm,Substring,Knuth Morris Pratt,给定模式的前缀函数中有没有可能有这样的东西 0 0 1 2 3 0 1 2 34 5 3 4 56 7 0 1 2 在上述前缀函数中,4 5之后是否只有6或0的可能性?如果有可能在4-5之后出现上述情况,例如3(小于5且大于0),则模式应如何 我能想到的模式只有和这个相似 a b a b a b a b c a 0 0 1 2 3 4 5 6 0 1 谢谢。下面是一个示例模式,其中您在6点之后出现了失败链接4: a b c a b c d a b c a b c a 0 0 0 1 2 3

给定模式的前缀函数中有没有可能有这样的东西

0 0 1 2 3 0 1 2 3<代码>4 5 3 4 56 7 0 1 2

在上述前缀函数中,4 5之后是否只有6或0的可能性?如果有可能在4-5之后出现上述情况,例如3(小于5且大于0),则模式应如何

我能想到的模式只有和这个相似

a b a b a b a b c a 
0 0 1 2 3 4 5 6 0 1

谢谢。

下面是一个示例模式,其中您在6点之后出现了失败链接4:

a b c a b c d a b c a b c a
0 0 0 1 2 3 0 1 2 3 4 5 6 4

下面是一个示例模式,其中在6之后出现故障链接4:

a b c a b c d a b c a b c a
0 0 0 1 2 3 0 1 2 3 4 5 6 4

你的例子是不可能的。当您开始从所需的前缀表构造字符串时,您会得到

0 0 1 2 3 0 1 2 3 4 5 3 4 5 6 7 0 1 2
a b a b a c a b a b a
  • 第一个符号是任意的,比如a
  • 第二个符号必须与第一个符号不同,否则前缀长度将为1
  • 第三个必须与第一个相同
  • 第四个必须与第二个相同
  • 第五个必须与第三个相同
  • 如果到目前为止使用的两个符号都不可用,a将给出前缀长度1,b为4
  • 第七个必须是第一个
  • 一定是第二名
  • 一定是第三名
  • 一定是第四名
  • 一定是第五名
  • a的前缀长度为1,b的前缀长度为4,c的前缀长度为6,其他所有前缀长度均为0
  • 表中与length
    p
    前缀对应的条目给出了该前缀的最宽边框
    b
    的宽度,例如
    w
    。下一个条目只能是
    w+1
    (如果
    b
    是可扩展的)、0(如果没有匹配的前缀),或者比
    b
    的某些边框的宽度大一个


    因此,如果
    table[p]
    包含长度-p前缀最宽边框的宽度(带有
    table[0]=-1
    ),那么
    table[p+1]
    1+table[p]
    1+table[p]
    1+table[table[…[table[p]]]]]=1+table[0
    ,你的具体例子是不可能的。当您开始从所需的前缀表构造字符串时,您会得到

    0 0 1 2 3 0 1 2 3 4 5 3 4 5 6 7 0 1 2
    a b a b a c a b a b a
    
  • 第一个符号是任意的,比如a
  • 第二个符号必须与第一个符号不同,否则前缀长度将为1
  • 第三个必须与第一个相同
  • 第四个必须与第二个相同
  • 第五个必须与第三个相同
  • 如果到目前为止使用的两个符号都不可用,a将给出前缀长度1,b为4
  • 第七个必须是第一个
  • 一定是第二名
  • 一定是第三名
  • 一定是第四名
  • 一定是第五名
  • a的前缀长度为1,b的前缀长度为4,c的前缀长度为6,其他所有前缀长度均为0
  • 表中与length
    p
    前缀对应的条目给出了该前缀的最宽边框
    b
    的宽度,例如
    w
    。下一个条目只能是
    w+1
    (如果
    b
    是可扩展的)、0(如果没有匹配的前缀),或者比
    b
    的某些边框的宽度大一个


    因此,如果
    table[p]
    包含长度-p前缀最宽边框的宽度(带有
    table[0]=-1
    ),那么
    table[p+1]
    1+table[p]
    1+table[p]
    1+table[table[…[table[p]]]]]=1+table[0]
    ,你坚持以5为例吗?我可以给你看一个6后有3的例子。我看到了你的答案,这是错误的。你坚持要有一个5的例子吗?我可以给你展示一个6后3的示例模式。我看到了你的答案,这是错误的。我使用了维基百科文章中定义的失败链接:@AnanthaKrishnan 6和7在你的失败链接中肯定是错误的。剩下的只是解释的问题…@阿南塔克里希南·伊索莫菲乌斯已经做到了。唯一的解释问题是你是否像他那样(像你一样)再加上一个0。这两种方法都可以,你只是对故障链接的用法进行了编码,但有一点不同。为什么“abcab”序列有1?“应该是2吗?”阿列克谢·亚历山德罗夫事实上我相信上面有不止1个错误。我真的不记得我当时在想什么。我将修复失败的链接。谢谢。我正在使用维基百科文章中定义的失败链接:@AnanthaKrishnan 6和7在你的失败链接中肯定是错误的。剩下的只是解释的问题…@阿南塔克里希南·伊索莫菲乌斯已经做到了。唯一的解释问题是你是否像他那样(像你一样)再加上一个0。这两种方法都可以,你只是对故障链接的用法进行了编码,但有一点不同。为什么“abcab”序列有1?“应该是2吗?”阿列克谢·亚历山德罗夫事实上我相信上面有不止1个错误。我真的不记得我当时在想什么。我将修复失败的链接。非常感谢。