我该如何比较c ++中的2张地图?

问题描述 投票:0回答:2

(问题)长按的名称:

您的朋友正在键盘上输入他的名字。有时,在键入字符c时,按键可能会被长按,并且该字符将被键入1次或多次。

您检查键盘的键入字符。如果可能是您的朋友名字,并且长按了某些字符(可能没有字符),则返回True。

我的怀疑::我试图用C ++ STL映射解决这个问题,但是对于这个测试用例,我得到了错误的答案:名称=“ saeed”

typed =“ ssaaedd”

这是我的代码:

bool isLongPressedName(string name, string typed) {

    unordered_map<char,int>m1,m2;
    for(int i=0;i<name.size();i++)
    {
        m1[name[i]]++;
    }
    for(int i=0;i<typed.size();i++)
    {
        m2[typed[i]]++;

    }
    if(m2.size()!=m1.size()) return false;
    int b=0;
    for(int a=0;a<m2.size();a++)
    {
        if(typed[a]!=name[b] ||m2[typed[a]]<m1[name[b]] )
        {
            return false;
        }



        if(m2[typed[a]]>m1[name[b]])
        {
            return true;
        }

        b++;
    }

    return true;

请帮助我解决这个问题。

c++ stl hashmap string-comparison
2个回答
0
投票

[基本上,不需要复杂的解决方案。只是一点点逻辑。

我们按字符比较字符。如果发现不匹配项,并且在“类型”中有一个双精度字,那么我们将跳过该双精度字。

我们在while循环中这样做:

while ((name[n] != typed[t]) && (t > 0) && (t < typed.size()) && (typed[t] == typed[t - 1])) ++t;
  • 首先检查两个字符串中的字符是否相等name[n] != typed[t]
  • 如果不是,则在执行其他操作之前,请检查索引是否在边界t > 0t < typed.size()
  • 下一步,检查前一个字符是否与当前字符typed[t] == typed[t - 1]相同。这是一个长按。
  • 如果是这样,则从“键入的”字符串中跳过此字符。 ++t

请参阅以下代码,包括一些测试用例(带有边际案例):

#include <iostream>
#include <string>
#include <utility>
#include <vector>

bool isLongPressedName(std::string name, std::string typed) {

    // Initial assumption is that result is OK. Additionally check for some corner cases
    bool result{ (!name.empty() || typed.empty())};

    // As long as OK, go through both strings
    for (size_t n{}, t{}; result && n < name.size() && t < typed.size(); ++n, ++t) {

        // Jump over double characters as long as necessary
        while ((name[n] != typed[t]) && (t > 0) && (t < typed.size()) && (typed[t] == typed[t - 1])) ++t;

        // Calculate result
        result = (name[n] == typed[t]);
    }
    return result;
}

int main() {

    for (const auto& [name, typed] : std::vector<std::pair<std::string, std::string>>{
        {"abc", "abc"}, {"abc", "abccccc"},{"abc", "aaaaabc"},{"abc", "abbbbbc"},{"abbc", "abccccc"},
        {"ab", "ab"},   {"ab", "aaaaaab"},{"ab", "abbbb"},
        {"saeed", "ssaaedd"},
        {"saeed", "ssssaaeeeeedd"},
        {"sss", "ssssssssss"},
        {"s", "ss"},
        {"", "s"},
        {"", ""},

        }) {

        std::cout << "'" << name << "' and '" << typed << "' are long press equal? --> " 
            << std::boolalpha << isLongPressedName(name, typed) << '\n';
    }
    return 0;
}

0
投票

这里是另一种简单的方法:

bool isLongPressedName(string name, string typed) {
    if (name.size() >= typed.size()) return false;
    if (name.size() > 0 && name[0] != typed[0]) return false;
    bool long_pressed = false;
    int i = 1, j = 1;
    while (i < name.size() && j < typed.size()) {
        if (name[i] == typed[j]) {
            ++i; ++j;
        } else {
            if (name[i-1] == typed[j]) {
                ++j;
                long_pressed = true;
            } else {
                return false;
            }
        }
    }
    return long_pressed;
}
© www.soinside.com 2019 - 2024. All rights reserved.