用C ++打印重复的字母

时间:2016-04-08 11:50:05

标签: c++ string for-loop

我想写一个程序,我打印重复的字母。这里我有代码,但它为我打印整个单词。你能给我一些建议吗?

#include <iostream>

using namespace std;
int main(){
string slowo, temp, temp2;

cout << "Insert word: ";
cin >> word;

for(int i = 0; i <= word.length(); i++){
    temp = word[i];

    for(int j = 1; j < word.length(); j++){
        temp2 = word[j];

        if(temp == temp2)
            cout << temp2;
    }
}
return 0;
}

3 个答案:

答案 0 :(得分:2)

  1. for(int i = 0; i <= word.length(); i++){
    应为i < word.length()(超出范围)

  2. for(int j = 1; j < word.length(); j++){
    我想for(int j = i + 1; ...可以更好地工作。

  3. 此外,temptemp2足以成为char(您正在构建不必要的新字符串)。

    但请注意,如果这些字母重复多次,则此字母或已接受的解决方案将多次输出字母。例如。单词“reparature”将输出字母'r'三次。如果您只需输出一次重复的字母,则需要跟踪已写出的字母,例如std :: map(或带有C ++ 11的unordered_map)。

    此外,你可以实际处理O(n)中的单词(使用std :: unordered_map)或O(n * log n)(使用std :: map)而不是O(n ^ 2)(当前溶液)。

    这里如何在O(n)(摊销)中这样做:

    unordered_map<char, int> mem;
    for (int i = 0; i < word.length(); i++){
        const char c = word[i];
        if (mem[c]++ == 1)
           cout << c;
    }
    

答案 1 :(得分:1)

这是一个做你想做的事的例子:

#include <iostream>
#include <string>
#include <set>

using namespace std;

int main(){
    string word, temp, temp2;
    set<char> letters;

    cout << "Insert word: ";
    cin >> word;

    for (auto letter1: word) {
        int match = 0;
        for (auto letter2: word) {
            if (letter1 == letter2)
                match++;
            if (match > 1)
                letters.insert(letter1);
        }
    }

    cout << "\nRepeated letters found:\n";
    for (auto letter:letters)
        cout << letter << "\n";

    return 0;
}

运行时的结果:

Insert word: anaconda

Repeated letters found:
a
n

答案 2 :(得分:0)

试试这个,不需要临时的std :: string变量:

// ...

更新正如评论者提到的那样,上面会重复打印字符,所以这里有一个解决方法:

std::cout << "Insert word: ";

std::string word;
std::cin >> word;

std::set<char> repeated;
for (auto i = 0; i < word.length(); ++i) {
    for (auto j = 0; j < i; ++j) {
        if (word[j] == word[i]) {
            if (repeated.find(word[i]) == repeated.end()) {
                repeated.insert(word[i]);
                std::cout << word[i];
            }
        }
    }
}