【问题标题】:Binary Map with Array Key C++带有数组键 C++ 的二进制映射
【发布时间】: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;
}

【问题讨论】:

标签: c++ data-structures


【解决方案1】:

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

你有

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

但你也需要比较的另一面

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

考虑案例{1, 2} &lt; {0, 3}。 如果没有第二次检查,您将返回 true

【讨论】:

  • 更简洁:if (a[i] != b[i]) return a[i] &lt; b[i];(否则继续循环)。
  • 我认为 OP 的问题是学术性的,因为 built-in operator < 在这种情况下会做正确的事情,而 那个 会最简洁。
  • 感谢有道理。一个快速跟进的问题,地图如何知道两个键何时相等?有没有像 unordered_map 这样的相等函数?
  • 当 a
猜你喜欢
  • 1970-01-01
  • 2014-09-09
  • 1970-01-01
  • 2011-09-16
  • 1970-01-01
  • 2018-02-24
  • 1970-01-01
  • 2020-12-15
  • 2012-08-16
相关资源
最近更新 更多