Boyer Moore アルゴリズムの実装に取り組んでいます。数時間後に期限が切れるのに、この厄介なシフトの部分が機能しません。1 対 1 の一致、つまり boyerMoore "hello" "hello" がある場合に機能します。
ただし、「ほわれよう」「あれ」には通用しません。
私の問題は、ifs のある boyMoore エリア内にあるとほぼ確信しています。
それは、shift メソッドではなく、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