Найти количество слов палиндромов/перевертышей в строке
Для начала попытался сделать так, чтобы программа искала слова и записывала их в массив, чтобы в дальнейшем можно было проверить массив как отдельное слово. Не могу найти ошибку.
void flipFlop(string &str) {
int j = 0;
for (int i = 0; i < str.length(); i++) {
if (str[i] != ' ' && str[i] != '\0') {
string word;
while (str[i] != ' ' && str[i] != '\0') {
word[j] = str[i];
i++;
j++;
}
cout << word << endl;
i = 0;
j = 0;
}
}
}
Ответы (1 шт):
Сперва хочу заметить, что не стоит в c++ использовать "голые" указатели на вручную алоцированую память. Дело в том, что создается опасность, что вы не освободите память из-за того, что забудите или досрочно выйдите из цикла и т.д. Тем более когда это касается строк - для них есть замечательный контейнер: std::string который вы тоже используете, но, почему-то только отчасти.
Вот пример как можно реализовать поиск полиндромов средствами c++:3 вида контейнеров (std::string, std::list, std::set) и всего один алгоритм (std::copy)
// main.cpp
#include <algorithm>
#include <cstdlib>
#include <iostream>
#include <iterator>
#include <list>
#include <regex>
#include <set>
using StringList = std::list<std::string>;
using Polyndroms = std::set<std::string>;
StringList getWordList(const std::string &str) {
StringList retval;
std::regex reg{R"(\w+)"};
std::copy(std::sregex_token_iterator{str.begin(), str.end(), reg},
std::sregex_token_iterator{},
std::back_inserter(retval));
return retval;
}
Polyndroms getPolyndroms(const StringList &list) {
Polyndroms retval;
for (const std::string &word : list) {
std::string revertWord;
std::copy(word.rbegin(), word.rend(), std::back_inserter(revertWord));
if (word == revertWord) { // then the word is polyndrom
retval.insert(word);
}
}
return retval;
}
int main() {
std::string str;
std::copy(std::istreambuf_iterator<char>{std::cin},
std::istreambuf_iterator<char>{},
std::back_inserter(str));
StringList words = getWordList(str);
Polyndroms polyndroms = getPolyndroms(words);
std::copy(polyndroms.begin(),
polyndroms.end(),
std::ostream_iterator<std::string>(std::cout, "\n"));
return EXIT_SUCCESS;
}
Программа выведет все полиндромы из ввода в алфавитном порядке и без повторов. Можно отметить больший расход памяти из-за копирования при проверке на полиндром, если его убрать, то потребление памяти заметно снизиться (при больших объемах ввода), но это уже оставлю Вам.
PS также не стоит использовать using namespace std; - это плохая практика.