Как я могу сравнить 2 карты в C ++? - PullRequest
0 голосов
/ 03 мая 2020

(вопрос) Длинное нажатое имя:

Ваш друг печатает свое имя на клавиатуре. Иногда при вводе символа c клавиша может долго нажиматься, и символ будет набираться 1 или более раз.

Вы просматриваете набранные символы клавиатуры. Верните True, если возможно, что это было имя вашего друга, с некоторыми символами (возможно, ни с одним), которые долго нажимались.

My Doubt: : я пытался решить этот вопрос с помощью c ++ STL карт но я получаю неправильный ответ для этого теста: name = "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;

Пожалуйста, помогите мне решить эту проблему.

1 Ответ

0 голосов
/ 03 мая 2020

Это еще один способ, я его протестировал, и isLongPressedName ("s", "sd") правильно выдает false.

bool isLongPressedName(string name, string typed) {
    if (name.size() >= typed.size()) return false;
    bool long_pressed = true;
    int i = 0, j = 0;
    while (i < name.size() && j < typed.size()) {
        if (name[i] == typed[j]) {
            if (i < name.size() - 1) ++i;
            ++j;
        } else {
            if (i > 0 && name[i-1] == typed[j]) {
                ++j;
            } else {
                return false;
            }
        }
    }
    return long_pressed;
}
...