Я хочу написать программу, в которой я печатаю повторяющиеся буквы. Здесь у меня есть код, но он печатает все слово для меня. Вы можете дать мне какой-то совет?
#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;
}
Попробуйте это, не нужно иметь временные переменные 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];
}
}
}
}
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 (или unordered_map с C ++ 11).
Кроме того, вы можете обработать слово в 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;
}
Вот один пример, чтобы сделать то, что вы хотите:
#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