Часто задаваемая задача при интервью:
Проверка строк на идентичность. То есть, выражаясь математическим языком, задача сводится к определению является ли одна строка конечной перестоновкой другой, такие строки называются анаграмами.
Пример:
торс
сорт
трос
рост
Наиболее оптимальным решением мне видется следующая реализация:
Code:
#include <algorithm>
#include <iostream>
#include <string>
typedef unsigned int uint;
inline bool notZero(uint n) {
return n!=0;
}
bool areAnagrams(const std::string& s1, const std::string& s2) {
uint hist[256] = {0};
if(s1.length() != s2.length()) return false;
for(std::string::const_iterator i = s1.begin(), j = s2.begin(); i != s1.end(); ++i, ++j) {
++hist[(uint)*i];
--hist[(uint)*j];
}
return std::find_if(hist, hist + 256, notZero) == hist + 256;
}
int main() {
std::cout << areAnagrams("google", "elgoog");
}
Если есть непонятки в реализации спрашиваете - разъясню.
Шкурой чую, что оптимальнее переписать - мёртвый номер.
Так, что особо пытливым умам предлагается просто переписать иначе.