仍在努力尝试实施Boyer Moore算法。 几个小时后我就无法让这个讨厌的轮班工作了。 它有效,如果有1:1匹配,即 boyerMoore“你好”“你好”
但它不适用于“howareyou”“是”
我几乎可以肯定我的问题在于带有ifs的boyMoore区域。
我很确定它是boyerMoore函数本身的东西而不是移位方法。只是想知道我是否以正确的方式调用它或者我是否在寻找某些东西?感谢任何帮助。 也很抱歉今天提出这么多问题,只是希望完成这项任务,因为它是我们的最后一项。
boyerMoore :: String -> String -> Bool
boyerMoore [] _ = False
boyerMoore mainString patternString =
let
patternLength = (length patternString)
position = getPosition patternString (take patternLength(mainString))
in if (mainString == patternString)
then True
else
if position > -1
then boyerMoore (patternString) (drop position(mainString))
else boyerMoore (patternString) (drop patternLength(mainString))
getPosition :: String -> String -> Int
getPosition [] _ = -1
getPosition mainString patternString = shift patternString mainString (length patternString)
shift :: String -> String -> Int -> Int
shift [] _ _ = -1
shift textString patternString lengthVariable =
if (last patternString) == (last textString)
then lengthVariable - (length patternString)
else shift (init patternString) textString lengthVariable
答案 0 :(得分:3)
boyerMoore
的最终等式开始
boyerMoore mainString patternString =
但最后的递归调用都具有
形式boyerMoore patternString (drop foo mainString)
我对Boyer-Moore的了解很生疏,但我怀疑你想要patternString
与mainString
交换。
其次,我认为您可能会将the page you link to上的 last()函数与Haskell的last
函数混淆。 last
给出了你给它的列表的最后一个元素,而 last(),尽管有符号,它有两个参数:要查找的字符和要查看的模式字符串