2

我有一个看起来非常简单的解决方案:

void determineStringUnique(std::string str) {
    std::sort(str.begin(), str.end()); //sort characters
    std::unique(str.begin(), str.end()); //remove duplicate characters in a row (why we did std::sort right before)
    std::cout << str.size() << std::endl;
}

(我意识到这个功能还没有完成,我只是在研究 std::unique 之后的大小。剩下要做的就是检查新大小是否等于原始大小 - 如果是,那么只有独特的字符)。

但是当我打印出 str.size() 时,它总是等于原始字符串的长度。经过一些调试后,我发现 std::unique 删除了预期的(重复的)字符,但字符串中总有一些地方添加了一些字符等,我不知道为什么。

这是一个示例输入:“abcdefghijklmnopabc”。在 std::sort 之后,我得到了“aabbccdefghijklmnop”,正如预期的那样。但是在 std::unique 之后,我得到了“abcdefghijklmnopnop”,这意味着它在末尾添加了“nop”,但在开头确实去掉了额外的 a、b 和 c。

如果有人对此有答案,将不胜感激。谢谢!

4

2 回答 2

6

正如您所提到的,std::unique()实际上并没有删除元素,它只是将它们打乱。它有一个返回值...

int countUniqueCharacters(std::string str)
{
    // e.g. str = "abcdefabc"
    std::sort(str.begin(), str.end());
    // e.g. str = "aabbccdef"
    auto i = std::unique(str.begin(), str.end());
    // e.g. str = "abcdef???" with i pointing to first "?"
    // (in other words, i = str.begin() + 6)
    // Note that "?" is an unknown character, not an actual question mark
    return i - str.begin();
    // returns 6
}

str::unique()功能_

于 2013-06-25T00:14:12.940 回答
2

unique是矫枉过正,有一个功能正是你想要的。

void determineStringUnique(std::string str) {
    std::sort(str.begin(), str.end()); //sort characters
    std::cout << std::adjacent_find(str.begin(), str.end()) == str.end << std::endl;
}
于 2013-06-25T09:38:28.327 回答