0

今日は中間試験でした。これが最初の質問でした。私はこれを解決できませんでした。正確な要件は次のとおりです。たとえば、「DA」が別の「ABCD」のサブセットであるかどうかを判断する必要があります。文字数は重要です。たとえば、「DAD」は「ABCD」のサブセットではありません。親文字列では「D」が 1 回発生するのに対し、「D」は 2 回繰り返されるためです。また、ノーと仮定することもできます。親文字列の文字数は、常に他の文字列以上です。

私はこれについて多くのことを考えました。これに対する私のアプローチは、見つかった部分文字列の文字を親文字列と比較することでした。一致が見つかった場合、そのインデックスを 3 番目の配列に格納します。そのため、最終的には、他の配列の文字と一致する親配列の文字の配列が得られます。これは、私が取得できた距離です。

#include <iostream>
#include <cstring>
using namespace std;

int main()
{
char array[] = "ABCD";
char array1[] = "AB";

int size = strlen(array);
int size1 = strlen(array1);

int temp[size];
int no = 0;
for (int i = 0; i< size1; i++)
        {
        for (int j = 0; j< size; j++)
                {
                if  (array1[i]==array[j])
                        {
                        for(int k = 0; k<size ; k++)
                                {
                                if (temp[k] != j)
                                        {
                                        temp[no] = j;
                                        no++;
                                        }
                                }
                        }
                }
        }

for (int i = 0; i<size; i++)
cout<<endl<<temp[i]<<" ";
return 0;
}

これを解決するために親切に助けてください。これに対する別のアプローチがある場合は、私に連絡してください。また、配列または文字列は、この問題に対するより良いアプローチです。私はC++で書いています よろしくお願いします

4

2 に答える 2

1

(私は最近、これを学生向けのクイズとして使用しましたが、Groovy と Java を使用しています。)

簡単なアプローチ: 文字列 ( "ABCD")のコピーを作成し、一致した文字を削除して、それらが再び一致しないようにします。たとえば、「D」と「A」を一致させた後、コピーは"_BC_"別の「D」と一致しません。 "。

于 2012-10-05T17:00:44.063 に答える
0

また、各文字列の各文字の出現回数を数えて、2 番目の文字列の各文字の数が最初の文字列の各文字の数以下であることを確認することもできます。これは、可能性のある複数の部分文字列を 1 つの文字の集合と比較したい場合 (たとえば、辞書内のすべての単語を Boggle 内の現在の文字と比較する場合) に適しています。

このコードはそれを行います。英語のアルファベットの大文字 26 文字を含む文字列でのみ機能するという主な制限があります。しかし、それはアイデアを伝えます。

#include <iostream>
#include <cstring>
using namespace std;

void stringToArray(char *theString, int *countArray) {
    int stringLength = strlen(theString);
    for (int i=0; i<26; i++) {
        countArray[i] = 0;
    }
    for (int i=0; i<stringLength; i++) {
        countArray[theString[i] - 'A']++;
    }
}

bool arrayIsSubset(int *superCount, int *subCount) {
    //returns true if subCount is a subset of superCount
    bool isSubset = true;
    for (int i=0; i<26 && isSubset; i++) {
        isSubset = subCount[i] <= superCount[i];
    }
    return isSubset;
}

int main()
{
    char array[] = "ABCD";
    char array1[] = "AB";
    char array2[] = "ABB";

    int letterCount[26], letterCount1[26], letterCount2[26];

    stringToArray(array, letterCount);
    stringToArray(array1, letterCount1);
    stringToArray(array2, letterCount2);

    cout << "array1 is " << (arrayIsSubset(letterCount, letterCount1) ? "" : "not ") << "a subset" << endl;
    cout << "array2 is " << (arrayIsSubset(letterCount, letterCount2) ? "" : "not ") << "a subset" << endl;
}

生成:

array1 is a subset
array2 is not a subset
于 2012-12-07T00:40:01.253 に答える