繁体   English   中英

查找给定字符串中的所有非重复字符

[英]Finding ALL Non Repeating characters in a given string

于是我被问到这个问题:

查找给定字符串中的所有非重复字符;

在做了一些谷歌搜索后,我很清楚找到第一个非重复字符是很常见的。 我找到了很多关于如何做到这一点的例子,但我还没有真正找到任何关于如何找到所有非重复字符而不仅仅是第一个的信息。

到目前为止,我的示例代码是:

#include <iostream>
#include <unordered_map>

using namespace std;

char findAllNonRepeating(const string& s) {

    unordered_map<char, int> m;

    for (unsigned i = 0; i < s.length(); ++i) {
        char c = tolower(s[i]);

        if (m.find(c) == m.end())
            m[c] = 1;
        else
            ++m[c];
    }

    auto best = m.begin();

    for (auto it = m.begin(); it != m.end(); ++it)
        if (it->second <= best->second)
            best = it;

    return (best->first);
}


int main()
{
    cout << findAllNonRepeating("dontknowwhattochangetofindallnonrepeatingcharacters") << endl;
}

我不确定我需要更改或添加什么才能找到所有非重复字符。

k, f, p, s 应该是这个字符串中的非重复字符。

非常感谢任何提示或想法!

按照建议,只需保留一个频率图。 然后,一旦字符串被处理,遍历映射,只返回那些恰好出现一次的值。

#include <iostream>
#include <map>
#include <vector>

using namespace std;

std::vector<char> nonRepeating(const std::string& s)
{
    std::map<char, int> frequency;
    for(int i=0;i<s.size();i++)
    {
        frequency[s[i]]++;
    }
    std::vector<char> out;
    for(auto it = frequency.begin(); it != frequency.end(); it++)
    {
        if(it->second == 1)
            out.push_back(it->first);
    }
    return out;
}

int main() {
    // your code goes here
    std::string str = "LoremIpsum";
    for(char c : nonRepeating(str))
    {
        std::cout << c << std::endl;
    }
    return 0;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM