2017-10-09 95 views
-1

所以我給了這個問題:查找給定字符串中的所有非重複字符

查找給定字符串中的所有非重複字符;

在做了一些Google搜索之後,很明顯我發現找到第一個不重複的字符很常見。我發現了很多如何做的例子,但是我沒有找到任何關於如何找到所有非重複字符而不是第一個的例子。

我的示例代碼到目前爲止是:

#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應該是該字符串中的非重複字符。

任何提示或想法,非常感謝!

+1

只需修改第二個循環來查找值爲1的所有元素,是不是很明顯? – Beta

+0

您希望確定哪些字符會出現一次(並返回一個字符串)或對它們進行計數,但計算出現的字符出現次數最少。 – molbdnilo

+0

這感覺就像一個家庭作業問題。 –

回答

0

正如所建議的,只需保留一個頻率圖。然後,一旦字符串被處理,迭代地圖,只返回那些恰好出現一次的值。

#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; 
} 
+0

謝謝Joris,我很感激幫助。在編碼方面我還是很初學者!這幫了我很多。 – JFive575

相關問題