【问题标题】:Given an Array of strings how do I Remove Duplicates?给定一个字符串数组,我如何删除重复项?
【发布时间】:2017-08-11 14:02:57
【问题描述】:

我想知道如何从容器中删除重复的字符串,但忽略尾随标点的单词差异。

例如给定这些字符串:

我们为什么会在这里?

我想得到这个输出:

我们为什么在这里?

【问题讨论】:

  • 文档中有一篇很棒的关于标记化的文章:stackoverflow.com/documentation/c%2b%2b/488/stdstring/2148/… 一位伟大的作者;)也许查看一下会有所帮助。读完之后,您也许可以自己解决问题。如果不是,您真的需要编辑问题以澄清。你是:1)询问如何标记字符串? 2)问如何比较字符串? 3)询问如何从单词中删除标点符号? 4)询问如何从容器中删除重复的字符串?请注意,您应该只对其中一项说“是”,否则您的问题过于宽泛。
  • @Shubham 所以你真的在问 3 4。对于一个问题来说仍然可能太多了,但至少要编辑它,这样很明显你不是在问如何标记一个字符串。
  • 您还想规范大写吗?

标签: c++ string duplicates containers punctuation


【解决方案1】:

算法:

  1. 阅读单词成功后,执行以下操作:
  2. 如果文件结束,退出。
  3. 如果单词列表为空,则推回单词。
  4. 其他开始
    搜索单词列表。
  5. 如果单词不存在,则推回该单词。
    否则结束(第 4 步)
  6. 结束(读单词时)

使用std::string 表示您的话。 这允许您执行以下操作:

std::string word;
while (data_file >> word)
{
}

使用std::vector 包含您的文字(尽管您也可以使用std::list)。 std::vector 动态增长,因此如果您选择了错误的大小,您不必担心重新分配。
要附加到std::vector,请使用push_back 方法。

要比较std::string,请使用operator==

std::string new_word;
std::vector<std::string> word_list;
//...
if (word_list[index] == new_word)
{
  continue;
}

【讨论】:

    【解决方案2】:

    所以you have said 你知道如何标记一个字符串。 (如果你不在这里花一些时间:https://stackoverflow.com/a/38595708/2642059)所以我假设我们得到了一个vector&lt;string&gt; foo,其中包含可能带有标点符号的单词。

    for(auto it = cbegin(foo); it != cend(foo); ++it) {
        if(none_of(next(it), cend(foo), [&](const auto& i) {
                                                             const auto finish = mismatch(cbegin(*it), cend(*it), cbegin(i), cend(i));
                                                             return (finish.first == cend(*it) || !isalnum(*finish.first)) && (finish.second == cend(i) || !isalnum(*finish.second));
                                                            })) {
            cout << *it << ' ';
        }
    }
    

    Live Example

    这里值得注意的是,您没有给我们关于如何处理诸如“down”、“down-vote”和“downvote”之类的词的规则。该算法假定 1st 2个相等。你也没有给我们如何处理的规则:“为什么,我们在这里,在这里?”这个算法总是返回最后的重复,所以输出会是“我们为什么在这里?”

    如果此算法做出的假设不完全符合您的喜好,请给我留言,我们将努力让您对这段代码感到满意,以便您可以进行所需的调整。

    【讨论】:

    • 我只是一个初学者。所以我会尝试理解代码。感谢您的回复。
    • @Shubham 我鼓励您花一些时间来解决这个问题,因为我相信这是您问题的最佳解决方案。我提供了 Live Example,您可以使用它来分叉并尝试不同的东西。如果有什么具体的可以向您解释的,请告诉我。
    猜你喜欢
    • 2021-02-14
    • 1970-01-01
    • 2017-12-30
    • 1970-01-01
    • 1970-01-01
    • 2012-09-15
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    相关资源
    最近更新 更多