ワイルドカードというものがあり、*は任意の文字列 ?は任意の一文字にマッチします。たとえばc*tにはcatやcourtがマッチします。形式言語学で言うと、ワイルドカードは正規表現の一種なのでオートマトンの応用で判定できます。たとえばc*tとcatを考えます。

   c * t   ->  c * t  ->  c * t  ->  c * t

  ^          c    ^      a     ^ ^   t     ^ ^ ^

まずスタート位置にコマ(^)を置きます。文字が一致すれば次に進みます。パターンが?の時にはどの文字にもマッチします。パターンが*の時には、元の位置にも残して次の位置にもコマを進めます。このようにして、最後にゴール地点にコマがあればマッチしたことになります。

 

 

以前に考えたコードに間違いがあったようで、複数のコマがある情況では処理が衝突することがあるので、いったん新しい所に作成して書き戻すようにしました。またc*tにctをマッチさせるにはイプシロン遷移という処理が必要です。とりあえず、動いています。

 

BOOL IsWild()

{

    int lenP = lstrlen(pat);

    int lenS = lstrlen(str);

    for (int i = 0; i < 100; i++)

        bWild[i] = FALSE;

    bWild[0] = TRUE;

    for (int i = 0; i < lenS; i++)

    {

        for (int j = 0; j <= lenP; j++)

            bNext[j] = FALSE;

        int c = str[i];

        for (int j = 0; j < lenP; j++)

        {

            int d = pat[j];

            if (bWild[j])

            {

                switch (d)

                {

                case '*':

                    bNext[j] = TRUE;

                    bNext[j + 1] = TRUE;

                    break;

                case '?':

                    bNext[j + 1] = TRUE;

                    break;

                default:

                    if (c == d)

                        bNext[j + 1] = TRUE;

                    break;

                }

            }

        }

        for (int j = 0; j <= lenP; j++)

            bWild[j] = bNext[j];

        for (int j = lenP; j > 0; j--)

        {

            if (bWild[j - 1] && pat[j - 1] == '*')

                bWild[j] = TRUE;

        }

    }

    return bWild[lenP];

}

 

 

ダウンロード
関連するファイルです。こちらも入れなおしました。
wild.zip
zip ( 圧縮 ) ファイル 22.2 KB