ENGINEER_GUIDANCE: 文字列探索
テキストエディタの「検索機能」や、コマンドラインの「grep」など、実務で最も使われる処理の一つです。より早く見つけるための工夫を学びましょう。
1. 力まかせ法 (Brute-Force Search)
パターンの先頭(左端)から順番に1文字ずつ比較し、不一致になれば探索位置を「1つだけ右」にずらして、また最初からやり直す手法です。実装は非常にシンプルですが、不一致になるたびに1文字しか進めないため、長いテキストでは処理時間がかかります(計算量
O(m × n))。
2. BM法 (Boyer-Moore法)
「どうせ比較するなら、末尾(右端)から比較した方が、間違っていた時に一気に飛ばせるのではないか?」という発想から生まれた、極めて実用的なアルゴリズムです。
- 事前にパターン文字列を解析し、「スキップ表」を作成します。
- パターンの末尾から比較し、不一致が起きた場合、「テキスト側の不一致だった文字が、パターン文字列のどこに含まれているか」をスキップ表で確認します。
- もし含まれていなければ、パターンの長さ分を丸ごと一気にスキップできます。
この「一気にスキップできる」特性により、一般的な文字列検索において最強クラスの実行速度(計算量 O(n)
未満になることも多い)を誇ります。