2017-10-09 9 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のすべての要素を見つけるために2番目のループを変更するだけではわかりませんか? – Beta

+0

あなたは、どの文字が一度出現するかを決定し(そして代わりに文字列を返す)か、またはそれらを数えたいが、出現する文字が最も少ない時間を計算している。 – molbdnilo

+0

これは宿題のような感じです。 –

答えて

0

推奨されているように、周波数マップを保存するだけです。その後、文字列が処理されると、マップを繰り返し処理し、正確に1回発生する値のみを返します。

#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

関連する問題