发现一个字符串(“AB”)是否是另一个字符串(“ABCD”)的子集?

时间:2012-10-05 16:32:24

标签: c++ string subset substring

我今天做了期中考试。这是第一个问题。我无法解决这个问题。 具体要求如下: 我们必须确定一个字符串,比方说,“DA”是另一个字符串,“ABCD”。字母数量至关重要,例如“DAD”不是“ABCD”的子集。因为“D”重复两次,而在父字符串“D”中重复一次。也可以假设没有。父字符串的字母总是等于或大于另一个。

我对此有很多想法。我的方法是,我将比较要找到的子字符串与父字符串的字符。如果找到匹配,我将其索引存储在第三个数组中。所以最后我会得到父数组的字符数组,它与另一个数组中的字符匹配。这就是我能够得到多远。

#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 ++写作 提前谢谢

2 个答案:

答案 0 :(得分:1)

(我最近将此作为我的学生的测验,但我们使用的是Groovy和Java。)

简单的方法:创建字符串("ABCD")和打击匹配字母的副本,以便它们不会再次匹配,例如匹配“D”和“一个“,副本将是"_BC_",它与另一个”D“不匹配。

答案 1 :(得分:0)

您还可以计算每个字符串中每个字母的出现次数,并确保第二个字符串中每个字母的计数小于或等于第一个字符串中每个字母的计数。如果要将多个潜在子串与单个字母集合进行比较(例如,将字典中的所有单词与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