我想写一个程序,我打印重复的字母。这里我有代码,但它为我打印整个单词。你能给我一些建议吗?
#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;
}
答案 0 :(得分:2)
for(int i = 0; i <= word.length(); i++){
应为i < word.length()
(超出范围)
for(int j = 1; j < word.length(); j++){
我想for(int j = i + 1; ...
可以更好地工作。
此外,temp
和temp2
足以成为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];
}
}
}
}