Учитывая две строки, напишите метод, чтобы решить, является ли это анаграммой/перестановкой другой. Это мой подход:I Am Able To Go Out Array Bounds
Я написал эту функцию, чтобы проверить, являются ли 2 строки анаграммами (такими как собака и бог).
В ASCII, а до г составляет 97 - 122.
В основном я есть массив BOOLS, которые все изначально ложными. Каждый раз, когда я сталкиваюсь с символом в строке string1, он обозначает его как true.
Чтобы проверить, является ли его анаграмма, я проверяю, являются ли какие-либо символы строки2 ложными (должно быть истинным, если встречается в строке1).
Я не уверен, как это работает: arr [num] = true; (не должен работать, потому что я не принимаю во внимание, что ascii начинается с 97 и, следовательно, выходит за пределы).
(Примечание стороны: есть лучший подход, чем у меня)
EDIT: Спасибо за все ответы! Будем внимательно читать каждый. Кстати: не задание. Это проблема из кодирования интервью практики книги
bool permutation(const string &str1, const string &str2)
{
// Cannot be anagrams if sizes are different
if (str1.size() != str2.size())
return false;
bool arr[25] = { false };
for (int i = 0; i < str1.size(); i++) // string 1
{
char ch = (char)tolower(str1[i]); // convert each char to lower
int num = ch; // get ascii
arr[num-97] = true;
}
for (int i = 0; i < str2.size(); i++) // string 2
{
char ch = (char)tolower(str2[i]); // convert char to lower
int num = ch; // get ascii
if (arr[num-97] == false)
return false;
}
return true;
}
См [это] (http://programmers.stackexchange.com/a/294094/40065) о буфере обнаружения переполнения –
Почему бы вы ожидать, что она не работает? C не проверяет границы. Если вы выходите из пределов, вы просто обновите любую память, находящуюся в этом месте (или, возможно, получите нарушение segfault/access, если адрес находится вне вашего процесса). Предполагая, что это не AV, если он не падает, это просто чистая глупая удача. – Donnie
С уважением, вопрос «хороший» и «боги». – Keith