-1

我正在学习 C++ 并做一些在线挑战。但是,似乎大多数“正常”挑战我总是卡住。我不确定是我缺乏知识,还是只是想多了。无论如何,如果有人可以帮助我,我将不胜感激。

我正在尝试做这个挑战:例如,我的输入是一个数字“N”,之后我将不得不输入“N”个字符串。

然后我必须为每个字符串类型找到最少数量的前缀,并确保它们不重复。

例如,字符串“stackoverflow”有很多前缀:s,st,sta,stac,stack,stacko,stackov,stackove,stackover,stackoverf,stackoverfl,stackoverflo,stackoverflow。

这些都是stackoverflow的前缀。因此,如果我们有另一个字符串“standup”,我们必须输入 stackoverflow - stac,因为standup 中已经有 sta,所以standup 将是 stan。

提前致谢。

4

2 回答 2

1

我能想到的最简单的版本;

  • 按字母顺序对单词列表进行排序。将倒数第二个单词的副本附加到列表中。

  • 对于列表中的每个单词,其唯一前缀是与列表中的下一个单词相比使其唯一的字母数。

一个例子,stackoverflowstandupseer

列表变为;

seer
stackoverflow
standup
stackoverflow

seer only requires `se` to be unique as compared to `stackoverflow`.
stackoverflow requires `stac` to be unique as compared to `standup`.
standup requires `stan` to be unique as compared to `stackoverflow`.

完毕。

于 2013-02-21T20:11:29.897 回答
0

创建一棵树:(尝试?)

让这棵树中的每个节点最多有 26 个孩子,每个字母 (az) 一个。

从根到叶的路径表示一个字符串。

        root
          \
           s
           |
           t
           |
           a
           /\
          c n
         /  |
        k   d
        |   |
        o   u
         ...

只需将所有项目添加到此树中即可。

然后,使用深度优先搜索处理树,每当您获得一个在其子树中只有 1 个叶子的节点(您可以跟踪这些计数)时,打印该字符串并递归。因此,在cn将只有 1 片叶子,因此您将分别打印stacstan

我不会说上述方法特别适合更大的 C++ 程序员,但这里有一些代码应该可以工作:(请原谅下面的 C 和 C++ 的灾难性混合以及各种其他暴行,这只是一个超级快速-和肮脏的方法)

链接

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

class Node
{
  public:
    int count;
    Node *(children[26]); // array of pointers
    Node() { count = 0; for (int i = 0; i < 26; i++) children[i] = NULL; };
};

void add(char *s, Node &n)
{
    if (*s == 0) // null-terminator
      return;
    if (n.children[*s-'a'] == NULL)
      n.children[*s-'a'] = new Node();
    n.count++;
    add(s+1, *n.children[*s-'a']);
}

void print(char *start, char *end, Node &n)
{
    if (n.count == 1)
    {
        *end = 0; // null-terminator
        cout << start << endl;
        return;
    }
    for (int i = 0; i < 26; i++)
    {
        if (n.children[i] != NULL)
        {
            *end = (char)(i+'a');
            print(start, end+1, *n.children[i]);
        }
    }
}

int main()
{
    char *s = "stackoverflow";
    Node root;
    add(s, root);
    s = "standup";
    add(s, root);
    char output[1000]; // big buffer
    print(output, output, root);
}
于 2013-02-21T20:11:17.167 回答