【LeetCode】1021. 刪除最外層的括號

題目描述

有效括號字符串爲空 ("")、"(" + A + ")" 或 A + B,其中 A 和 B 都是有效的括號字符串,+ 代表字符串的連接。例如,"","()","(())()" 和 "(()(()))" 都是有效的括號字符串。

如果有效字符串 S 非空,且不存在將其拆分爲 S = A+B 的方法,我們稱其爲原語(primitive),其中 A 和 B 都是非空有效括號字符串。

給出一個非空有效字符串 S,考慮將其進行原語化分解,使得:S = P_1 + P_2 + ... + P_k,其中 P_i 是有效括號字符串原語。

對 S 進行原語化分解,刪除分解中每個原語字符串的最外層括號,返回 S 。

示例

示例 1:

輸入:"(()())(())"
輸出:"()()()"
解釋:
輸入字符串爲 "(()())(())",原語化分解得到 "(()())" + "(())",
刪除每個部分中的最外層括號後得到 "()()" + "()" = "()()()"。

示例 2:

輸入:"(()())(())(()(()))"
輸出:"()()()()(())"
解釋:
輸入字符串爲 "(()())(())(()(()))",原語化分解得到 "(()())" + "(())" + "(()(()))",
刪除每隔部分中的最外層括號後得到 "()()" + "()" + "()(())" = "()()()()(())"。

示例 3:

輸入:"()()"
輸出:""
解釋:
輸入字符串爲 "()()",原語化分解得到 "()" + "()",
刪除每個部分中的最外層括號後得到 "" + "" = ""。

提示:

  • S.length <= 10000
  • S[i] 爲 "(" 或 ")"
  • S 是一個有效括號字符串

解答

  • 自己解答:
class Solution {
 public String removeOuterParentheses(String S) {
        Stack<Character> stack = new Stack<>();
        char c ;
        StringBuilder sum = new StringBuilder();
        for(int i=0;i<S.length();i++){
            c = S.charAt(i);
            if(stack.size()==1&&c==')'){
                stack.pop();
            }else if(stack.size()==1&&c!=')'){
                stack.push(c);
                sum.append(c);
            }else if(stack.size()>1&&c==')'){
                stack.pop();
                sum.append(c);
            }else if(stack.size()>1&&c=='('){
                stack.push(c);
                sum.append(c);
            }else if(stack.size()==0){
                stack.push(c);
            }
        }
        return sum.toString();
    }
}
  • 熱門答案
class Solution {
    public String removeOuterParentheses(String S) {
        StringBuilder ans = new StringBuilder();
        Stack<Character> stack = new Stack<>();

        int start = 0;// 初始化原語的起始位置
        int end = 0;// 初始化原語的結束位置
        boolean flag = false;// 標誌每個原語

        for (int i = 0;i < S.length();i++) {
            char ch = S.charAt(i);

            if (ch == '(') {// 遇到左括號,入棧
                stack.push(ch);
                if (!flag) {// 遇到的第一個左括號,是原語的開始位置,記錄下原語開始位置
                    start = i;
                    flag = true;
                }
            }

            if (ch == ')') {// 遇到右括號,出棧
                stack.pop();
                if (stack.isEmpty()) {// 當棧空的時候,找到了一個完整的原語
                    end = i;// 記錄下結束位置
                    ans.append(S.substring(start + 1,end));// 去掉原語的最外層括號,並追加到答案中
                    flag = false;// 置標誌爲false,往後接着找下一個原語
                    start = end;// 往後找,再次初始化原語開始位置
                }
            }
        }

        return ans.toString();
    }
}
  • 性能對比
答案 提交結果 執行時間 內存消耗
自己解答 通過 27ms 37.2M
熱門答案 通過 18ms 37.6M
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章