Karp-Rabin 模式匹配算法的简单实现
Naive implementation of Karp-Rabin pattern matching algorithm
我在实施 Karp-Rabin pattern marcher 的原始版本时遇到问题;我没有得到预期的结果。这是我的例子;
string='today is a good day'
sub='good'
我想在上面的字符串中找到好的模式。
def kapr(n,m):
for i in range(len(n)-len(m)+1):
for j in range(len(m)):
if n[i+j-1]!=m[j]:
continue
return i
return not found
Print (kapr(string, sub))
输出=0
预期输出=11
,应该对应字符串中good的偏移量
感谢您的帮助。
您想要 break
而不是 continue
。 Continue 将继续进行内循环的下一次迭代,而 break
将退出内循环。此外,您不会通过使用 break 直接跳到外循环的下一次迭代,因此您将点击 return i
语句。要阻止这种情况发生,您可以使用 for/else
分支。
例如
for j in range(len(m)):
if n[i+j-1]!=m[j]:
break
else:
return i
如果内循环正常完成,它只会return i
。
它 returns 的索引也不是零索引的,所以通过上面的修改它将 return 12. 如果你想让它是零索引的,应该很容易更新!
我在实施 Karp-Rabin pattern marcher 的原始版本时遇到问题;我没有得到预期的结果。这是我的例子;
string='today is a good day'
sub='good'
我想在上面的字符串中找到好的模式。
def kapr(n,m):
for i in range(len(n)-len(m)+1):
for j in range(len(m)):
if n[i+j-1]!=m[j]:
continue
return i
return not found
Print (kapr(string, sub))
输出=0
预期输出=11
,应该对应字符串中good的偏移量
感谢您的帮助。
您想要 break
而不是 continue
。 Continue 将继续进行内循环的下一次迭代,而 break
将退出内循环。此外,您不会通过使用 break 直接跳到外循环的下一次迭代,因此您将点击 return i
语句。要阻止这种情况发生,您可以使用 for/else
分支。
例如
for j in range(len(m)):
if n[i+j-1]!=m[j]:
break
else:
return i
如果内循环正常完成,它只会return i
。
它 returns 的索引也不是零索引的,所以通过上面的修改它将 return 12. 如果你想让它是零索引的,应该很容易更新!