Перво-наперво: не объявляйте метод static
. В лучшем случае это сбивающее с толку ключевое слово, учитывая все роли, которые оно может выполнять ... так что оставляйте на время, когда это действительно необходимо (например, метод или атрибут класса, который не связан ни с одним экземпляром).
Относительно алгоритма: вы почти на месте, но только присутствия недостаточно, вам нужно учесть и количество символов.
Давайте сделаем это просто:
bool anagram(std::string const& lhs, std::string const& rhs)
{
if (lhs.size() != rhs.size()) return false; // does not cost much...
std::vector<int> count(256, 0); // count of characters
for (size_t i = 0, max = lhs.size(); i != max; ++i)
{
++count[lhs[i]];
--count[rhs[i]];
}
for (size_t i = 0, max = count.size(); i != max; ++i)
if (count[i] != 0) return false;
return true;
} // anagram
Давайте посмотрим на это: anagram("abc","cab")
- Инициализация:
count = [0, 0, ...., 0]
- Первый цикл
i == 0
> ['a': 1, 'c': -1]
- Первый цикл
i == 1
> ['a': 0, 'b': 1, 'c': -1]
- Первый цикл
i == 2
> ['a': 0, 'b': 0, 'c': 0 ]
И второй цикл пройдет без проблем.
Варианты включают в себя поддержание двух массивов счетчиков (по одному для каждой строки) и последующее сравнение их. Это немного менее эффективно ... хотя на самом деле это не имеет значения.
int main(int argc, char* argv[])
{
if (argc != 3) std::cout << "Usage: Program Word1 Word2" << std::endl;
else std::cout << argv[1] << " and " << argv[2] << " are "
<< (anagram(argv[1], argv[2]) ? "" : "not ")
<< "anagrams" << std::endl;
}