带有数组键C++的二进制映射

Binary Map with Array Key C++

本文关键字:二进制 映射 C++ 数组      更新时间:2023-10-16

这是我在黑客级别上提出的sherlockAndAnagrams解决方案。目标是找到字符串中匹配的子字符串变位符号的数量。例如,"abba"将有变位词,["a","a"],["ab","ba"],【"abb","bba"】,【"b","b"】。

为了解决这个问题,我试图创建一个二进制映射,使用数组作为键。然而,我编写的comparator函数并不能捕获每个测试用例。对于我之前给出的例子("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;
}

您之所以有UB,是因为您的比较器不能满足严格的弱排序要求。

你有

if(a[i] < b[i])
return true;

但你也需要比较的另一面

if(a[i] > b[i])
return false;

考虑案例{1, 2} < {0, 3}。如果没有第二张支票,您将返回true