60 lines
1.1 KiB
C++
60 lines
1.1 KiB
C++
#include "anagram.h"
|
|
|
|
#include <algorithm>
|
|
|
|
|
|
namespace anagram {
|
|
|
|
|
|
using namespace std;
|
|
|
|
|
|
namespace {
|
|
|
|
struct Helper
|
|
{
|
|
Helper(const string &str, const locale &loc)
|
|
{
|
|
lowercase = str;
|
|
transform(lowercase.begin(), lowercase.end(),
|
|
lowercase.begin(), [=](char c){return tolower(c, loc);});
|
|
|
|
normalized = lowercase;
|
|
sort(normalized.begin(), normalized.end());
|
|
}
|
|
|
|
string lowercase;
|
|
string normalized;
|
|
};
|
|
|
|
}
|
|
|
|
anagram::anagram(const string &_key)
|
|
: key(_key)
|
|
{
|
|
}
|
|
|
|
StringContainer
|
|
anagram::matches(const StringContainer &input,
|
|
const locale &loc) const
|
|
{
|
|
StringContainer result(input.size());
|
|
|
|
const Helper key_helper(key, loc);
|
|
|
|
auto is_anagram = [=](const string &str) {
|
|
|
|
Helper helper(str, loc);
|
|
return helper.normalized == key_helper.normalized
|
|
&& helper.lowercase != key_helper.lowercase;
|
|
};
|
|
|
|
auto iter = copy_if(input.cbegin(), input.cend(),
|
|
result.begin(), is_anagram);
|
|
|
|
result.resize(distance(result.begin(), iter));
|
|
|
|
return result;
|
|
}
|
|
|
|
}
|