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

Решение: Считайте двоичные подстроки

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

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”