【棧】B016_LC_反轉每對括號間的子串(棧記錄左括號 + 局部翻轉)

一、Problem

You are given a string s that consists of lower case English letters and brackets.

Reverse the strings in each pair of matching parentheses, starting from the innermost one.

Your result should not contain any brackets.

Input: s = "(u(love)i)"
Output: "iloveu"
Explanation: The substring "love" is reversed first, then the whole string is reversed.

Constraints:

0 <= s.length <= 2000
s only contains lower case English characters and parentheses.
It’s guaranteed that all parentheses are balanced.

二、Solution

方法一:棧記錄左括號

class Solution {
    void reverse(char[] s, int l, int r) {
        while (l < r) {
            char c = s[l];
            s[l++] = s[r];
            s[r--] = c;
        }
    }
    public String reverseParentheses(String S) {
        char[] s = S.toCharArray();
        Stack<Integer> st = new Stack<>();

        for (int i = 0; i < s.length; i++) {
            if (s[i] == '(')
                st.push(i);
            else if (s[i] == ')') {
                reverse(s, st.pop()+1, i-1);
            }
        }
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < s.length; i++) if (Character.isLetter(s[i])) {
            sb.append(s[i]);
        }
        return sb.toString();
    }
}

複雜度分析

  • 時間複雜度:O(n)O(n)
  • 空間複雜度:O(n)O(n)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章