带有数组键C++的二进制映射
Binary Map with Array Key C++
这是我在黑客级别上提出的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
。
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 有根的二进制搜索树.保留与其父级的链接
- 将函数类成员映射到类本身内部
- 如何在 C# 中映射双 C 结构指针?
- 如何在C++中使用结构生成映射
- 使用std::函数映射对象方法
- 如何加载(或映射)文件部分的最大大小,但适合在Windows上的RAM
- 多态二进制函数
- C++映射分割错误(核心转储)
- 内联映射初始化的动态atexit析构函数崩溃
- 使用"std::unordereded_map"映射到"std::list"对象
- 带有数组键C++的二进制映射
- 错误:二进制表达式的操作数无效(映射使用查找函数错误)
- 写入/读取 std::映射到二进制文件需要运算符
- 如何映射数组元素以选择二进制树节点
- 如何将std::映射输出到二进制文件
- c++中的内存映射二进制日志
- 使用映射增强二进制序列化,并在中的序列化时加倍崩溃