【发布时间】:2018-10-29 22:18:50
【问题描述】:
这是我在黑客等级上提出的 sherlockAndAnagrams 解决方案。目标是查找字符串中匹配的子串字谜的数量。例如,“abba”将有字谜,[“a”,“a”],[“ab”,“ba”],[“abb”,“bba”],[“b”,“b”]。
为了解决这个问题,我尝试创建一个二进制映射以使用数组作为键。但是,我编写的比较器函数无法捕获每个测试用例。对于我之前给出的示例 ("abba"),它会找到所有匹配项,但无法匹配 ["b","b"]。
我对比较器功能有什么不理解的地方吗?我相信它满足严格的弱排序。
struct cmpByArray {
bool operator()(const array<unsigned int, 26>& a, const array<unsigned int, 26>& b) const {
for(size_t i=0; i<a.size(); i++)
{
if(a[i] < b[i])
return true;
}
return false;
}
};
int sherlockAndAnagrams(string s) {
int matches = 0;
map< array<unsigned int, 26>, int, cmpByArray> m1;
for(size_t i=0; i<s.length(); i++)
{
cout << s[i] << std::endl;
for(size_t j=i; j<s.length(); j++)
{
cout << '-';
array<unsigned int, 26> arr = {0};
for(size_t k=i; k<=j; k++)
{
cout << s[k];
arr[s[k]-'a']++;
}
cout << endl;
if( m1.find(arr) != m1.end())
{
matches++;
cout << "match: " << endl;
}
else
{
m1[arr]++;
}
}
}
return matches;
}
【问题讨论】:
-
您需要自己的比较器吗?标准库提供了
std::array::operator<,它可以进行字典比较。
标签: c++ data-structures