Решения 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; vectorseen(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”