LeetCode Solutions (161 серия деталей)
Это является частью серии объяснений решения LeetCode ( index ). Если вам понравилось это решение или нашли его полезным, Пожалуйста, нравится Этот пост и/или upvote Мое решение по сообщению на форумах LeetCode Анкет
Проблема LeetCode #696 (легко): Считайте двоичные подстроки
Описание:
( прыгнуть в : Идея решения Код : JavaScript | Python | Java | C ++
Дал строку S
, подсчитайте количество непустых (смежных) подстроков, которые имеют одинаковое количество 0
S. и 1
и все 0
и все 1
В этих подстроках сгруппированы последовательно.
Подстроки, которые встречаются несколько раз, подсчитываются, количество раз, когда они встречаются.
Примеры:
Вход: | “00110011” |
Выход: | 6 |
Объяснение: | Есть 6 подстроков, которые имеют одинаковое количество последовательных 1 и 0: «0011», «01», «1100», «10», «0011» и «01». Обратите внимание, что некоторые из этих подстроков повторяются и подсчитываются, сколько раз они встречаются. Кроме того, «00110011» не является действительной подстрокой, потому что все 0 (и 1) не сгруппированы вместе. |
Вход: | “10101” |
Выход: | 4 |
Объяснение: | Есть 4 подстроения: «10», «01», «10», «01», которые имеют одинаковое количество последовательных 1 и 0. |
Ограничения:
S.Length
будет между1
и50 000
АнкетS
будет состоять только из ”0
” или ”1
“.
Идея:
( Прыгните к : Описание задачи Код : JavaScript | Python | Java | C ++
С тех пор, как 0 S. и 1 Следует сгруппировать последовательно, мы должны быть обеспокоены только последними двумя группами ( curr, prev ) в любое время, когда мы итерации через входную строку ( s ). Поскольку каждое дополнение к нашему ответу ( ans ), следовательно, должно быть сосредоточено на «краю» между двумя группами, мы должны быть в состоянии считать множественное увеличение до Анс в то же время.
Например, если мы найдем группу, которая есть “0001111” , тогда мы знаем, что мы нашли несколько ответов, сосредоточенных на “01” . Каждый дополнительный дополнительный символ с обеих сторон будет дополнительным ответом, что означает, что “0011” и “000111” также ответы. Другими словами, число, которое мы должны добавить в и равен Мин (нули, одному) , или 3 В этом примере.
Итак, теперь мы можем перевернуть через S , отслеживая карт и PREV Группы, и когда мы находим конец группы, мы можем рассчитать наше дополнение к Анс а затем поменяйте две переменные при сбросе Curr к 1 Анкет
Поскольку мы собираемся сравнивать s [i] к s [i-1] Чтобы увидеть, изменился ли персонаж, нам нужно начать нашу итерацию с я Что означает, что мы должны определить начальное значение для Curr из 1 Анкет Кроме того, с конца S Технически это конец группы, мы должны добавить еще один мин (curr, prev) на Ответ Прежде чем мы вернуть ANS , как это не будет объяснено в итерации через с .
- Сложность времени: O (n) куда N является длиной s
- Сложность пространства: O (1)
Реализация:
Есть лишь незначительные различия в коде для всех четырех языков.
Код JavaScript:
( Прыгните к : Описание задачи Идея решения
var countBinarySubstrings = function(s) { let curr = 1, prev = 0, ans = 0 for (let i = 1; i < s.length; i++) if (s[i] === s[i-1]) curr++ else ans += Math.min(curr, prev), prev = curr, curr = 1 return ans + Math.min(curr, prev) };
Код Python:
( Прыгните к : Описание задачи Идея решения
class Solution: def countBinarySubstrings(self, s: str) -> int: curr, prev, ans = 1, 0, 0 for i in range(1, len(s)): if s[i] == s[i-1]: curr += 1 else: ans += min(curr, prev) prev, curr = curr, 1 return ans + min(curr, prev)
Код Java:
( Прыгните к : Описание задачи Идея решения
class Solution { public int countBinarySubstrings(String s) { int curr = 1, prev = 0, ans = 0; for (int i = 1; i < s.length(); i++) if (s.charAt(i) == s.charAt(i-1)) curr++; else { ans += Math.min(curr, prev); prev = curr; curr = 1; } return ans + Math.min(curr, prev); } }
C ++ Код:
( Прыгните к : Описание задачи Идея решения
class Solution { public: int countBinarySubstrings(string s) { int curr = 1, prev = 0, ans = 0; for (int i = 1; i < s.length(); i++) if (s[i] == s[i-1]) curr++; else ans += min(curr, prev), prev = curr, curr = 1; return ans + min(curr, prev); } };
LeetCode Solutions (161 серия деталей)
Оригинал: “https://dev.to/seanpgallivan/solution-count-binary-substrings-p89”