【问题标题】:Write a function that crosses out up to n-1 signs of a n-letter word, and returns the amount of unique strings created that way编写一个函数,删除一个 n 字母单词的 n-1 个符号,并返回以这种方式创建的唯一字符串的数量
【发布时间】: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 我知道。这是迷幻的

标签: c++ arrays char


【解决方案1】:

我建议先解决没有复杂案例的问题。例如,假设您的输入永远不会有重复的字母。然后在纸上手动求解一个由 2 个字符组成的字符串,然后是 3 个,然后是 4 个,直到您看到一个模式发展为您在手动执行时手动使用的算法。然后对其进行编码,并使其工作。一旦它起作用了。解决下一个问题,重复。好吧,那里有几个选择。如果单词已经在您的列表中,请不要添加它或从列表中删除所有重复项。

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

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

我确实建议您寻找具有出色调试器的开发环境。一种可以让您逐行浏览代码并查看发生了什么的方法。 Visual Studio Community 是我熟悉的免费社区。但我知道还有其他人。我只是不知道它们是什么。

【讨论】:

  • 我从 Visual Studio 开始(我一直在那里使用 C#,所以这是一个自然的选择),但是分配的复杂性让我选择了 GCC 编译器(那些 const 大小的数组刚刚使任务更艰巨)。谢谢你的建议!
  • 感谢您的感谢。帮助人们变得更加愉快。
猜你喜欢
  • 2022-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多