массивы — метод обнаружения анаграмм c ++. Проблемы с преобразованием строки в значение ascii

Для любого, кто мог бы помочь мне понять это. Я создаю метод, который будет сравнивать две строки и определять, являются ли они анаграммой или нет. Анаграмма — это две строки с одинаковыми буквами, хотя они могут быть в другом порядке. Например, «слушай» и «ильтсен» — анаграммы.

Я решил разбить строки на массивы символов. Я знаю, что это работает правильно, потому что я тестировал его, используя cout для каждого элемента массива. Дальше, где это идет не так. Я пытаюсь использовать значение ASCII каждого символа и добавить его в переменную для каждого массива. Это будет означать, что если значения совпадают, то они должны быть анаграммой.

Однако по неизвестной причине он не работает правильно. Я обнаружил, что он читает индекс 0 дважды для одного массива, а не для другого. Я так запутался без причины. Я понятия не имею, что это происходит. Я пробовал несколько разных решений, и мне не повезло выяснить проблему. Если у кого-то есть идеи, что здесь происходит, я был бы очень признателен за помощь.

-Спасибо!

#include "stdafx.h"#include <iostream>
#include <string>
#include <math.h>
#include <iomanip>
#include <cctype>
#include <vector>
using namespace std;

bool isAnagram(string s1,string s2)
{

static char firstString[] = { 'c' };
static char secondString[] = { 'c' };
int size = s1.length();
static int count1 = 0;
static int count2 = 0;
cout << s1 << endl;
cout << s2 << endl;
if (s1.length() == s2.length())
{
for (int i = 0; i < size; i++)
{
firstString[i] = s1.at(i);
cout << i;
}
for (int i = 0; i < size; i++)
{
secondString[i] = s2.at(i);
cout << i;
}
cout << endl;

for (int i = 0; i < size; i++)
{
count1 = count1 + (int)firstString[i];
cout << "first" << i << ": " << firstString[i] << " = " <<         (int)firstString[i] << endl;
count2 = count2 + (int)secondString[i];
cout << "second" << i << ": " << secondString[i] << " = " << (int)secondString[i] << endl;
}
cout << count1 << " and " << count2 << endl;
if (count1 == count2)
return true;
}
else
return false;

count1 = 0;
count2 = 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
static char end;
do
{
string s1;
string s2;

cout << "Please enter the first string: ";
cin >> s1;
cout << endl << "Please enter the second string: ";
cin >> s2;

bool result = isAnagram(s1, s2);
static string resultString;

if (result == true)
resultString = "True";
else
resultString = "False";

cout << endl << "Anagram test result: " << resultString << endl;
cout << endl << "enter E for end or any other key to run again: ";
cin >> end;
cout << "----------------------------------------" << endl;
} while (end != 'e' && end != 'E');

return 0;
}

1

Решение

Бесполезно использовать статические переменные в вашем случае, без них вам не понадобятся последние 2 строки isAnagram,
Также бесполезно хранить обе строки в массивах символов, потому что вы можете использовать их непосредственно в третьем цикле (также вы переполняете буфер, размер которого равен 1)

for (int i = 0; i < size; i++)
{
std::cout << count1 << " ";
count1 = count1 + (int)s1.at(i);
cout << "first" << i << ": " << s1.at(i) << " = " << (int)s1.at(i) << endl;
count2 = count2 + (int)s2.at(i);
cout << "second" << i << ": " << s2.at(i) << " = " << (int)s2.at(i) << endl;
}

Также нельзя сказать, что 2 строки содержат одинаковые буквы, сравнивая сумму их значений ASCII, то есть 3 + 4 — это то же самое, что 2 + 5, потому что обе дают 7.
Вы можете создать массив из 52 ints, каждый элемент является счетчиком для своей собственной буквы, тогда вы можете зациклить обе строки одним циклом, где каждая буква первой строки увеличивает свой элемент в массиве, а буквы второй строки являются убывающими элементами.

if (s1.length() != s2.length())
return false;

std::vector<int> counts(52);

for (unsigned int i = 0; i < s1.length(); ++i)
{
++counts[s1[i] - (s1[i] < 91 ? 65 : 71)];
--counts[s2[i] - (s2[i] < 91 ? 65 : 71)];
}

убедитесь, что массив инициализирован в 0.
В конце вам нужно перебрать массив, если один из элементов не равен 0, это не анаграмма, иначе верните true.

for (unsigned int i = 0; i < 52; ++i)
if (counts[i] != 0)
return false;

return true;
1

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

Других решений пока нет …