我写了一个函数来确定两个单词是否是字谜.单词A是单词B的字谜,如果你可以通过重新排列字母来构建单词B,例如:
lead is anagram of deal
Run Code Online (Sandbox Code Playgroud)
这是我的功能:
bool is_anagram(std::string const & s1, std::string const & s2)
{
auto check = [](std::string const & x)
{
std::map<char, unsigned> counter;
for(auto const & c : x)
{
auto it = counter.find(c);
if(it == counter.end())
counter[c] = 1;
else
++counter[c];
}
return counter;
};
return check(s1) == check(s2);
}
Run Code Online (Sandbox Code Playgroud)
这样可以正常工作,但随着单词数量的增加(这个函数在我的应用程序中使用了数百万次),很快就成了我应用程序的主要瓶颈.
有没有人知道如何加快这个功能?
我有这个想法(使用C语言)来检查由ASCII字母组成的两个字符串是否是彼此的字谜:
检查字符串是否长度相同.
检查两个字符串的所有字符的ASCII值之和是否相同.
检查两个字符串的所有字符的ASCII值的乘积是否相同.
我相信如果所有三个都是正确的,那么字符串必须是彼此的字谜.但是,我无法证明这一点.有人可以帮助我证明或反驳这会起作用吗?
谢谢!