-1

効率的なアルゴリズムを作成する方法を学ぼうとしています。部分文字列を見つけるための私のコードは次のとおりです

 public static bool HasSubstring(string MainStr,string SubStr)
    {
        bool FoundMatch = false;

        for (int i = 0; i < MainStr.Length; i++)
        {

            if (SubStr.Length != 0)
            {
                int a = 0;
                int j = 0;
                if (MainStr[i] == SubStr[a])
                {
                    j = i;
                    do
                    {
                        if (MainStr[j] == SubStr[a])
                        {
                            a++;
                            j++;
                            FoundMatch = true;
                            continue;

                        }
                        else
                        {
                            FoundMatch = false;
                            break;
                        }


                    } while (a<SubStr.Length);
                    if (FoundMatch == true)
                    {
                        break;
                    }


                }
            }
        }

        return FoundMatch;


    }

このアプローチを最適化できますか?

4

3 に答える 3

2

これを改善するために私が見ることができることがいくつかあります

  • ループする前に、部分文字列の長さが 0 かどうかを確認し、そうであれば false を返します (反復ごとに確認しないでください)。
  • 基本的にブール値とブール値を比較するALL を削除します== true
  • IndexOfを使用して部分文字列の最初の文字を検索し (indexOf の結果が -1 の場合は false を返します)、このインデックスを i の開始値として使用します。
  • 変数の代わりにjインクリメントできると思いますiが、これはテストしていません

    if (FoundMatch)
      return true;
    
于 2013-06-07T07:29:34.487 に答える
1

次のアルゴリズムを見ることができると思います:

  • クヌース・モリス・プラット
  • ラビンカープ

これらは、部分文字列のすべての出現箇所を見つけたい場合に、文字列内でパターン マッチングを行うためのよく知られたアルゴリズムです。

于 2013-06-07T07:54:21.870 に答える
0

Do While の代わりに Wile を使用する。2 つのループの違いは、while 部分が最後にあるため、Do ループ内のコードが少なくとも 1 回実行されることです。先頭に while 部分があると、丸括弧内の終了条件が既に true になっている可能性があります (i は loopEnd を超える可能性があります)。そして、続ける必要はないと思います。

于 2013-06-07T07:52:05.620 に答える