массивы — Проверка, являются ли две строки анаграммами [C ++]

Я должен написать программу, которая будет принимать 2 строки, помещать их в функцию под названием «build_histogram» и создавать массив int, который ведет подсчет того, сколько раз каждая буква встречается в каждой строке, затем сравнивать массивы и, если они равны, тогда они анаграммы. В инструкциях говорится, что мы должны игнорировать все символы (например,!, Пробелы, _ и т. Д.), И они не должны быть чувствительными к регистру.

#include <iostream>
#include <string>
#include <cctype>
using namespace std;

void build_histogram(int letters[], string s) {

for(int i = 0; i < s.length(); i++) {
letters[s[i]]++;
}
}int main()
{
string s1, s2;
int* histogram1[26];
int* histogram2[26];

cout << "Enter two strings." << endl;
getline(cin, s1);
getline(cin, s2);

build_histogram(histogram1[26], s1);
build_histogram(histogram2[26], s2);

if(histogram1 != histogram2) {
cout << "They are not anagrams." << endl;
}
else {
cout << "They are anagrams!" << endl;
}

return 0;
}

Это то, что у меня есть, но независимо от того, какие строки я ввожу, я не могу заставить программу напечатать что-либо, кроме «Ввести две строки».

РЕДАКТИРОВАТЬ

Так что теперь это мой код … он правильно подсчитывает количество символов в каждой строке, единственная проблема теперь заключается в том, что оператор «if else» внизу все еще не распознает, что массивы одинаковы, также он имеет тяжелое время, когда такие символы, как ‘!’ в строках.

#include <iostream>
#include <string>
#include <cctype>
using namespace std;

void build_histogram(int letters[], string s) {

for(int i = 0; i < s.length(); i++) {
char currLetter = s[i];
currLetter = tolower(currLetter);

int index = currLetter - 97;
letters[index]++;
}
}int main()
{
string s1, s2;
int histogram1[26] = {0};
int histogram2[26] = {0};

cout << "Enter two strings." << endl;
getline(cin, s1);
getline(cin, s2);

build_histogram(histogram1, s1);
build_histogram(histogram2, s2);if (histogram1 == histogram2) {
cout << "They are not anagrams." << endl;
} else {
cout << "They are anagrams!" << endl;
}

return 0;
}

-1

Решение

Две строки — анаграммы, если они имеют одинаковую длину и одну std::is_permutation() другого.

Увидеть http://en.cppreference.com/w/cpp/algorithm/is_permutation

Можно написать функцию, чтобы проверить, являются ли две строки анаграммами:

bool is_anagram(const std::string& s1, const std::string& s2) {
return s1.size() == s2.size() &&
std::is_permutation(std::begin(s1), std::end(s1),
std::begin(s2), std::end(s2));
}
0

Другие решения

Это не все ваше решение, но это определенно начало.

Ваш letters[] Массив имеет только индексы от 0 до 25, поэтому вы хотите преобразовать ваши буквы, чтобы они соответствовали 0-25.

Вот простой способ сделать это:

void build_histogram(int* letters[], string s) {

for(int i = 0; i < s.length(); i++) {
char currLetter = s[i];
///force letter to become lowercase
currLetter = tolower(currLetter);

///make letter an ASCII value
int index = currLetter - 97;//subtract 97 to get a range from 0 to 25
letters[index]++;
}
}

Эта реализация превращает все буквы в строчные.

Кроме того, количество экземпляров 'a' будет храниться в индексе 0, и 'z' в индексе 25.

Надеюсь, это поможет вам идти по правильному пути!

-1

По вопросам рекламы [email protected]