Рубрики
Без рубрики

Решение: проверка Если строка содержит все двоичные коды размера k

Это является частью серии пояснений решения LeetCode (индекс). Если вам понравилось это решение или Фу … помечены алгоритмами, JavaScript, Java, Python.

Решения LeetCode (161 часть серии)

Это является частью серии объяснений решения LeetCode ( index ). Если вам понравилось это решение или нашел его полезным, Пожалуйста, как этот пост и/или УПОТАТЬ Мое решение пост на форумах LeetCode Отказ

Проблема летета # 1461 (средний): Проверять Если строка содержит все двоичные коды размера k

Описание:

( Перейти к : Идея решения Код : JavaScript | Python |. Java |. C ++

Учитывая двоичную строку с и целое число k .

Вернуть Правда Если каждый двоичный код длины к это подстрока S Отказ В противном случае верните Ложь Отказ

Примеры:

Вход:
Выход: правда
Объяснение: Двоичные коды длины 2 – «00», «01», «10» и «11». Они могут быть найдены в качестве подстроки на обозначении 0, 1, 3 и 2 соответственно.
Вход:
Выход: правда
Вход:
Выход: правда
Объяснение: Двоичные коды длины 1 – «0» и «1», понятно, что оба существуют как подстрока.
Вход:
Выход: ложный
Объяснение: Двоичный код «00» имеет длину 2 и не существует в массиве.
Вход:
Выход: ложный

Ограничения:

  • 1 длиной * 10 ^ 5
  • S состоит из 0 С. и 1 Только только.
  • 1

Идея:

( Перейти к : Описание проблемы Код : JavaScript | Python |. Java |. C ++

Наивное решение было бы итерацию через возможные двоичные строки и проверьте через входную строку ( S ), чтобы увидеть, существует ли каждый, но это быстро будет работать в TLE Отказ

Вместо этого у нас будет легче решение этой проблемы с противоположного направления. Мы можем проиграть через S и запишите каждое число, которое было видно Отказ Это также приносит более интересную точку: с таким относительно небольшим ограничением длины С Он ограничивает, сколько возможных чисел может производить строку.

Если мы думаем о Раздвижное окно К ширина движется вниз S тогда становится очевидным, что там может быть больше S.Length – K + 1 Возможные разные номера. Поскольку длина S ограничен 5e5. , это означает, что ответ автоматически будет ложный на К Значения 19 и 20 , Например.

В нашем решении, однако, мы можем просто выбрать итерацию через S назад, и используйте наш индекс ( i ) как способ отслеживать, насколько остаются итерации, и поэтому сколько шансов осталось найти оставшиеся номера. Если в любое время количество номеров осталось, чтобы найти ( Count ) меньше, чем Я Тогда нет никакого способа добраться до правды, поэтому мы должны Вернуть ложь Отказ

С другой стороны, если Считать сводится к 0 Затем мы нашли все номера и могут вернуть истину Отказ

Для того, чтобы быть максимально как можно исполняемым, мы можем использовать легкий Напечатанный массив для видно Отказ Держать от необходимости неоднократно получить и преобразовать подстроки мы можем использовать Битовое манипуляция изменить предыдущий Num С новым характером от S Чтобы получить новый оставлять .

Реализация:

JavaScript не имеет логического набранного массива, но мы можем использовать Uint8Array вместо.

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

Код JavaScript:

( Перейти к : Описание проблемы Идея решения

var hasAllCodes = function(S, K) {
    let len = S.length, count = 1 << K,
        seen = new Uint8Array(count),
        num = parseInt(S.slice(len - K + 1), 2) << 1
    for (let i = len - K; ~i; i--) {
        num = ((S.charAt(i) << K) + num) >> 1
        if (!seen[num]) seen[num] = 1, count--
        if (!count) return true
        if (i < count) return false
    }
};

Код Python:

( Перейти к : Описание проблемы Идея решения

class Solution:
    def hasAllCodes(self, S: str, K: int) -> bool:
        count = 1 << K
        seen = set()
        for i in range(len(S) - K, -1, -1):
            num = S[i:i+K]
            if num not in seen:
                seen.add(num)
                count -= 1
            if not count: return True
            if i < count: return False

Java код:

( Перейти к : Описание проблемы Идея решения

class Solution {
    public boolean hasAllCodes(String S, int K) {
        int len = S.length(), count = 1 << K;
        if (K > len) return false;
        int num = K > 1 ? Integer.parseInt(S.substring(len - K + 1), 2) << 1 : 0;
        boolean[] seen = new boolean[count];
        for (int i = len - K; i >= 0; i--) {
            num = (((S.charAt(i) - '0') << K) + num) >> 1;
            if (!seen[num]) {
                seen[num] = true;
                count--;
            }
            if (count == 0) return true;
            if (i < count) return false;
        }
        return false;
    }
}

C ++ код:

( Перейти к : Описание проблемы Идея решения

class Solution {
public:
    bool hasAllCodes(string S, int K) {
        int len = S.size(), count = 1 << K;
        if (K > len) return false;
        int num = K > 1 ? stoi(S.substr(len - K + 1), 0, 2) << 1 : 0;
        vector seen(count, false);
        for (int i = len - K; ~i; i--) {
            num = (((S[i] - '0') << K) + num) >> 1;
            if (!seen[num]) seen[num] = true, count--;
            if (!count) return true;
            if (i < count) return false;
        }
        return false;
    }
};

Решения LeetCode (161 часть серии)

Оригинал: “https://dev.to/seanpgallivan/solution-check-if-a-string-contains-all-binary-codes-of-size-k-26gg”