编写一个函数,将一个n字母单词的n-1个符号划掉,并返回以这种方式创建的唯一字符串的数量



假设我们有字符串*abcd,我将其称为"单词";。程序应该返回通过从"0"中划掉零个或多个字母而形成的唯一字符串*的数量;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";至CCD_ 6。然后对子字符串[6][2]等执行相同的过程。这将需要类似的函数

void addSubstring(char crossedOutIndexes[], char word[], char substr[][]){
//I haven't implemented that yet
}

我之所以问这个问题,是因为我在这个问题上已经遇到了很大的困难,而且我不知道如何实现addSubstring()函数。这是解决问题的正确想法吗?

我建议先解决问题,不要遇到复杂的情况。例如,假设您的输入永远不会有重复的字母。然后在纸上手动求解一个由2个字符组成的字符串,然后是3个字符,然后是4个字符,直到你看到一个模式发展为你手动执行时手动使用的算法。然后编写代码,让它工作起来。一旦奏效。解决下一个问题,重复。这里有几个选择。如果某个单词已经在您的列表中,请不要添加该单词,或者从列表中删除所有重复的单词。

对于可变长度数组,使用支持可变长度数组的编译器的初始解决方案适用于第一个版本。另一种可能性是简单地过度分配字符串数组。例如,一个包含10000个空字符串的数组。虽然记忆效率低下,但它对学习很好。一旦您有了一个有效的解决方案,您就可以随时移动到像std::vector这样的标准容器。

这里发生的一件事是,学习者经常会得到很好的建议。但他们仍在学习,所以建议让他们不知所措。使用支持可变长度数组的编译器并没有错,它只是将您锁定在该工具中。

我确实建议您找到一个具有出色调试器的开发环境。一个可以让你一行一行地浏览代码,看看发生了什么。Visual Studio社区是免费的,我很熟悉。但我知道还有其他人。我只是不知道它们是什么。

相关内容

  • 没有找到相关文章

最新更新