1190. 反转每对括号间的子串|Java 刷题打卡

230 阅读1分钟

本文正在参加「Java主题月 - Java 刷题打卡」,详情查看 活动链接

一、题目描述

image.png

二、解题思路

题目不难,就是反反复复看了好多遍题目。
image.png

1.使用栈

单独分析一对括号():

(ab)--->ba
//反转括号内的字符串

分析多对括号():

(a(ab)b)--->(abab)--->baba
//先从最内部括号()开始反转,然后由内而外逐层根据括号()反转

代码实现

//已(a(ab)b)为例
class Solution {
    public String reverseParentheses(String s) {
        Deque<String> stack = new LinkedList<String>();
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < s.length(); i++) {
            char ch = s.charAt(i);
            if (ch == '(') {
                //push("")
                //push("a")
                stack.push(sb.toString());
                sb.setLength(0);
            } else if (ch == ')') {
                //第一次 ab--->ba
                //第二次 abab--->baba
                sb.reverse();
                //第一次ba--->aba
                //第二次baba--->baba
                sb.insert(0, stack.pop());
            } else {
                //a--a--ab--aba--abab
                sb.append(ch);
            }
        }
        return sb.toString();
    }
}

时间复杂度分析

循环*反转的复杂度,故时间复杂度为:

  • O(n^2)

空间复杂度分析

栈中最多包含整个字符串,故空间复杂度为:

  • O(n)

不晓得我讲清楚了没有,请大家多多指教。
今日打卡结束!