仍在努力尝试实现 Boyer Moore 算法。几个小时后到期,我无法让这个讨厌的轮班部分工作。如果有 1:1 匹配,它会起作用,即 boyerMoore "hello" "hello"
但它不适用于“howareyou”“are”
我几乎可以肯定我的问题在于 ifs 的 boyMoore 区域。
我很确定这是 boyerMoore 函数本身的东西,而不是 shift 方法。只是想知道我是否以正确的方式调用它,或者我是否在寻找某些东西?感谢任何帮助。也很抱歉今天问了这么多问题,只是希望这个任务结束并完成,因为它是我们的最后一个任务。
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