Оптимальное решение, вероятно, будет основано на вычислении количества символов в каждой строке и последующем сравнении обоих значений.В идеале, мы должны использовать структуру данных Dictionary , но для простоты я продемонстрирую алгоритм на массиве:
char *word1 = "word1";
char *word2 = "ordw1";
// C strings can have only 256 possible characters, therefore let's store counts in an array with 256 items.
int* letterCounts1 = calloc(256, sizeof(int));
int* letterCounts2 = calloc(256, sizeof(int));
size_t length1 = strlen(word1);
size_t length2 = strlen(word2);
for (size_t i = 0; i < length1; i++) {
int letterIndex = word1[i] & 0xFF;
letterCounts1[letterIndex] += 1;
}
for (size_t i = 0; i < length2; i++) {
int letterIndex = word2[i] & 0xFF;
letterCounts2[letterIndex] += 1;
}
bool isAnagram = true;
for (size_t i = 0; i < 256; i++) {
if (letterCounts1[i] != letterCounts2[i]) {
isAnagram = false;
break;
}
}
free(letterCounts1);
free(letterCounts2);
if (isAnagram) {
printf("Anagram");
} else {
printf("Not anagram");
}
Этот алгоритм имеет линейную (O(n)
) сложность (итерация по«словарь» можно считать константой).
Ваше исходное решение имеет квадратичную сложность, однако вам также необходимо сохранить результат strlen
в переменных, поскольку каждый вызов strlen
имеетперебирать всю строку, увеличивая сложность до кубической.