0

プログラムのこの最後の部分について本当に助けが必要です。より大きな文字列内で文字列を見つける必要があり、見つかった場合は部分文字列の開始位置を返します。方向から:

文字列の位置は 0 から始まり、長さ -1 で終わることに注意してください。文字列が見つからない場合は、値 -1 が返されます。

開始して、次のコードをコンパイルします。これが実際に正しいかどうかを知りたいだけです。あまり頭を悩ませたくはありませんが、専門家からのフィードバックが必要です。私はこれを正しく行っていますか?または、少なくとも正しい方向に進んでいますか?

const int MyString::Find(const MyString& other)
{
    int start(0);
    int counter(0);
    int end = other.Size;
    int count(0);
    int end1 = Size;
    int nfound = -1;
    char* temp;

    if(other.String[0] != '\0' && other.String[0] != ' ')
    {
        if(other.String[count] == String[counter])
        {
            start = counter;

            for(int i = count; i < end-1;i++)
            {
                for(int j = counter; j < end1 -1; j++)
                {
                    temp[j] = String[j];
                }
            }
            if(other == temp)
            {
                return start;
            }
            else
                return nfound;
        }

        else{
            while(other.String[count] != String[counter])
            {
                counter++;
                if(other.String[count] == String[counter])
                {
                    start = counter;
                    for(int i = count; i < end-1;i++)
                    {
                        for(int j = counter; j < end1 -1; j++)
                        {
                            temp[j] = String[j];
                        }
                    }
                    if(other == temp)
                    {
                        return start;
                    }
                    else
                        return nfound;
                }
            }
        }
    }
    else
    {
        return nfound;
    }
}
4

2 に答える 2

1

あまり高度なことをしたくないと仮定すると、そのインデックスで始まる部分文字列が に等しい のインデックスがある場合にのみ、 がneedleの部分文字列であると考えてください。haystackhaystackneedle

また、多くの部分文字列をコピーする必要はありません。選択したインデックスから始めて、(a) 不一致が見つかるまで、文字ごとに比較してください。この場合、別のインデックスを試してください。または、(b) がなくなるまでhaystack、この場合またはいずれかのインデックスと一致することはできません。より大きなインデックス、または (c) 不足してneedleいる場合、一致が見つかったので、作業中のインデックスを返します。

一致するものが複数ある場合 (たとえば、 で を検索する場合"na") "banana"、道順でどれを返せばよいかがわかります。これにより、 のインデックスを考慮する順序がわかりますhaystack

非常に洗練された処理を実行したい場合は、Boyer-Moore、Knuth-Morris-Pratt、およびさまざまなトレードオフを持つ公開されているその他の多数の文字列検索アルゴリズムを調べてください。良いものを発明するには、複数の人が必要なようです。

于 2012-06-12T18:49:16.040 に答える
0

これは私の観点からはちょっと悪いコードです。\0 は、文字列の末尾を示すために char*-strings で使用されます。文字列をカプセル化するクラスでは使用する必要はありません。文字列の部分文字列を見つけるアルゴリズムはたくさんありますが、そのうちの 1 つに Knuth–Morris–Pratt アルゴリズムがあります。その他はこの記事に記載されている文字列検索アルゴリズム

于 2012-06-12T18:53:54.310 に答える