【发布时间】:2020-12-18 08:47:38
【问题描述】:
假设我们有字符串* abcd,我将其称为“单词”。该程序应返回通过从“abcd”中删除零个或多个字母而构成的唯一字符串的数量。在这个特定的例子中,这些唯一的字符串*是“abcd”、“abc”、“abd”、“acd”、“bcd”、“ab”、“ac”、“ad”、“bc”、“bd”、 “cd”、“a”、“b”、“c”、“d”。因此,在这种情况下,程序应该返回15。禁止在此分配中使用vectors 和strings,因此我将不得不使用char[] 数组。上面使用字符串*这个词是为了避免使已经很复杂的任务复杂化。字符串我的意思是char[]。
到目前为止,我的想法是创建存储具有相同长度的字符串的数组。我使用二项式公式找到的此类字符串的数量。 (例如,来自 4 个字母的单词中 3 个字母的字符串的数量是 C(3,4)。因此,在 for 循环中,我创建了所需的数组来容纳字符串并仅添加那些尚未包含的字符串那个数组。然后我返回数组中元素的数量。
//size is the size of the word, i is the number of crossed out letters
int total=0; //stores number of all possible little strings
for(int i=1; i<size; i++){
int sizeOfSubstring=binomial(size-i, size);
char substrings[sizeOfSubstring][size-i];
//populate the substrings array and return the number of char[] arrays added to it.
//Then add that number to total.
}
但是,您可以清楚地看到,这个问题已经很复杂了。我使用 GCC 绕过了 C++ 对常量数组大小的要求。但是,当您必须填充字符串数组时,情况会变得更糟。例如,我们需要将“abc”、“abd”、“acd”、“bcd”添加到substrings[4][3]。然后对 substrings[6][2] 等执行相同的过程。这将需要一个类似
void addSubstring(char crossedOutIndexes[], char word[], char substr[][]){
//I haven't implemented that yet
}
我问这个问题是因为我已经遇到了很大的困难,我不知道如何实现addSubstring() 函数。这甚至是解决问题的正确想法吗?
【问题讨论】:
-
因此,在您的 C++ 类中,正确的做法是使用无效的 C++ 代码(可变长度数组)而不是有效的 C++ 代码(字符串和向量)。我知道这不是你的错,但我会敲开课程主管的门,问他们认为他们在做什么。
-
您真的需要生成子字符串还是只计算可能的数量?
-
@RetiredNinja 我只需要知道他们有多少。但是我如何在不生成它们的情况下计算它们呢?
-
解决这个问题的最好方法是花时间编写自己的简单字符串和向量类。我完全确定这一点。您也可以在课程的其余部分使用它们。它们肯定有用。
-
@john 我知道。这是迷幻的