Как проверить, существует ли определённая строка внутри другой строки с определённым условием

Мне нужно написать функцию, которая возвращает true в случае если из первой строки, можно собрать вторую. И false если нельзя. Например:

scramble('rkqodlw', 'world') ==> True
scramble('cedewaraaossoqqyt', 'codewars') ==> True
scramble('katas', 'steak') ==> False
scramble('scriptjavx', 'javascript') ==> False

Вот, что я уже попробовал:

https://pastebin.com/Hw2qdGuB

Но код не проходит тест, когда в строке содержится одинаковое количество каких-либо символов, например в случае №4 символ a. Как можно реализовать алгоритм иначе и более эффективно?


Ответы (2 шт):

Автор решения: Кирилл Малышев
bool scramble(string s1, string s2) {
    unordered_multiset<char> letters(s1.begin(), s1.end());
    for(char& c : s2) {
        const auto it = letters.find(c);
        if (it != letters.end()) {
            letters.erase(it);
        } else {
            return false;
        }
    }
    return true;
}
→ Ссылка
Автор решения: Mikhailo

Можно вот так.

bool scramble(const string& a, const string& b) {
    int s[256] = {0};
    for(char c: a) s[(unsigned char)c]++;
    for(char c: b) if (--s[(unsigned char)c] < 0) return false;
    return true;
    }
→ Ссылка