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

Решение: Дольшие действительные скобки

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

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

Проблема лецкода № 32 (Hard): Дольшие действительные скобки

Описание:

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

Учитывая строку, содержащую только персонажи '(' и ')' Найдите длину самых длинных действительных (хорошо сформированных) скобок подстроки.

Примеры:

Вход:
Вывод: 2
Объяснение: Самые длинные допустимые скобки подстроки являются «()».
Вход:
Вывод: 4
Объяснение: Самые длинные допустимые скобки подстроки являются «() ()».
Вход:
Вывод: 0

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

  • 0 волн * 10^4
  • S [I] – «(» или «)».

Идея:

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

Одним из ключевых вещей, которые необходимо понимать о действительных строках скобок, заключается в том, что они полностью удовлетворяются самодоступными, что означает, что, в то время как вы можете иметь одну подстроку, которая полностью внутри другой, вы не можете иметь два подстроки, которые только частично совпадают.

Это означает, что мы можем использовать Жадные O (N) Сложность времени Решение этой проблемы без необходимости какого-либо обратно. На самом деле, мы должны быть в состоянии использовать очень стандартные основные алгоритмы строки на основе стека, всего в строке всего трех очень незначительных модификаций.

В допустимых строковых скобках алгоритм строки скобок, мы повторяем через строку ( S ) и толкайте индекс ( I ) любого ‘(‘ нашему стек . Всякий раз, когда мы находим ‘)’ ‘ мы сопоставляем его с последней записью на стек И поп сказал выключение. Мы знаем, что строка недействительна, если мы найдем ‘)’ ‘ Пока нет ‘(‘ Индексы в Stack с которым можно сопоставить его, а также, если у нас есть остаток ‘(‘ в Stack Когда мы достигнем конца S .

Для этой проблемы нам нужно будет добавить на шаг, который обновляет наш ответ ( ANS ), когда мы закрываем пару скобок. Так как мы сохранили индекс ‘(‘ В нашем стеке мы можем легко найти разницу между ‘)’ на i и последняя запись в стек , что должно быть длина действительной подстроки, которая была только что закрыта.

Но здесь мы столкнулись с проблемой, поскольку последовательные действительные подстроки могут быть сгруппированы в более широкую допустимую подстроку (т. Е. ‘() ()’ ). Так вместо того, чтобы подсчитывать от Последнее стек Вход, мы должны сосчитать от Второе до последнего Вход, чтобы включить любые другие допустимые закрытые подстроки с самого последнего ‘(‘ Это все равно останутся после того, как мы попметим вступил в прошлое Stack Выкл.

Это, конечно, приводит нас к второму и третьим изменениям. Так как мы проверяем второе до последнего стек запись, что происходит в случае ‘() ()’ Когда вы закрываете вторую действительную подстроку Тем не менее, есть только один стек вход влево в то время?

Чтобы избежать этой проблемы, мы можем просто обернуть всю строку в другом воображаемом наборе скобок, начиная с стек = [-1] указывая на то, что есть воображаемое ‘(‘ непосредственно перед началом строки на i .

Другой вопрос заключается в том, что мы захочем продолжать, даже если строка до Я становится недействительным из-за ‘)’ появляясь, когда стек «пустой», или в этом случае осталось только наш воображаемый индекс. В этом случае мы можем просто эффективно перезапустить наши стек Обновление нашего воображаемого ‘(‘ index ( Стек [0] ) и продолжайте.

Затем, как только мы достигнем конца S мы можем просто Вернуть АНС Отказ

Выполнение:

Есть только незначительные различия в коде для всех четырех языков.

Код JavaScript:

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

var longestValidParentheses = function(S) {
    let stack = [-1], ans = 0
    for (let i = 0; i < S.length; i++)
        if (S[i] === '(') stack.push(i)
        else if (stack.length === 1) stack[0] = i
        else stack.pop(), ans = Math.max(ans, i - stack[stack.length-1])
    return ans
};

Код Python:

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

class Solution:
    def longestValidParentheses(self, S: str) -> int:
        stack, ans = [-1], 0
        for i in range(len(S)):
            if S[i] == '(': stack.append(i)
            elif len(stack) == 1: stack[0] = i
            else:
                stack.pop()
                ans = max(ans, i - stack[-1])
        return ans

Java код:

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

class Solution {
    public int longestValidParentheses(String S) {
        Stack stack = new Stack<>();
        stack.push(-1);
        int ans = 0;
        for (int i = 0; i < S.length(); i++)
            if (S.charAt(i) == '(') stack.push(i);
            else {
                stack.pop();
                if (stack.isEmpty()) stack.push(i);
                else ans = Math.max(ans, i - stack.peek());
            }
        return ans;
    }
}

C ++ код:

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

class Solution {
public:
    int longestValidParentheses(string S) {
        vector stack = {-1};
        int ans = 0;
        for (int i = 0; i < S.size(); i++)
            if (S[i] == '(') stack.push_back(i);
            else if (stack.size() == 1) stack[0] = i;
            else {
                stack.pop_back();
                ans = max(ans, i - stack.back());
            }
        return ans;
    }
};

Оригинал: “https://dev.to/seanpgallivan/solution-longest-valid-parentheses-592n”