文字列の検索アルゴリズム

今回は、ある文字列の中に特定の文字列が含まれているかを調べ、含まれているならその位置を調べる検索アルゴリズムを考えてみます。これは、データベースの検索やテキスト処理ツールなどでも、最も基本的な処理ですね。

まあ、たいていの処理系にはあらかじめ検索用の関数が用意されているので、別に今回のような方法を考える必要はないのですが。

文字列の検索

文字列を検索する一番簡単な方法は、検索対象の文字列の最初から探す文字列(キー文字列)が含まれているか一字づつ探していく事です。例えば、3文字のキー文字列の最初の文字が見つかったら、検索対象文字列のその次の文字がキー文字列の2字めと一致するか調べ、一致したら3字目を調べます。もし3文字目まで一致すれば、3文字のキー文字列がすべて一致したわけで、検索対象文字列のその部分にキー文字列が含まれている事になるでしょう。
このアルゴリズムは、単純ですがこれでもたいていの場合は実用になると思います。もちろん、実際の検索では改行とか大文字と小文字、全角文字の扱いなど、多少注意を要する問題もあるのですが、基本さえ理解できていればあまり難しい問題ではないでしょう。

検索対象文字列  abcdefghijk
キー文字列      efg

 最初から1字づつ調べる

 a b c d e f g h i j k
↑
 一致しないのでそのまま次のb へ。

 a b c d e f g h i j k
         ↑
 最初の文字が一致したので、その次の文字がキー文字列の2字目(f)か調べる。

 a b c d e f g h i j k
           ↑
 2字目も一致。3字目を調べる。

 a b c d e f g h i j k
             ↑
 3字目(キー文字列の最後)まで一致したので、キー文字列を検出。
一致した最初の位置(5文字目)を文字列の最初の位置として返す。

この文字列検索アルゴリズムをプログラムにすると、以下のような感じです。

  private int search(String textS,String keyS) {

      char text[],key[];
      int i,j,textN,keyN;

      textN=textS.length(); /* 検索対象文字列の長さ */
      keyN=keyS.length();   /* キー文字列の長さ */

      if (keyN==0)
          return -1;

      text=textS.toCharArray(); /* 文字列を配列に */
      key=keyS.toCharArray();

      for (i=0;i<textN-keyN+1;i++) { /* 検索 */

          j=0; /* 比較位置を初期化 */

          /* 一文字ずつ比較 */
          while (j<keyN && text[i+j]==key[j]) {

              j++; /* 比較位置を一つずらす */

          }

          /* キー文字列と一致すればその位置を返す */
          if (j==keyN) 
              return i;

      }

      return -1; /* 最後まで一致しなければー1を返す */

  }

この例では、変数i が現在比較されているテキスト文字列の最初の位置を、j が現在比較されているキー文字列の位置を表しています。構造としては、テキスト文字列をi の位置から調べていき、キー文字列と一致した文字があればwhileループ内でj が増やされていく2重ループですね。jがキー文字列の長さにまで増やされればキー文字列が見つかった事を意味します。

プログラム

まず、text に検索対象の文字列をkey に検索するキーを入れてください。次に、search! ボタンをクリックすると検索が開始されます。キーが見つかると、その部分が選択状態となり反転表示されて下の方に見つかった位置が表示されるので、テキスト文字列とキー文字列を見比べてみましょう(ただし、環境によっては反転表示されない場合もあるかもしれません)。見つからなかった場合は、下の方に-1が表示されます。

プログラムソース表示


数学アルゴリズム演習室 > プログラミング資料庫