算法初探LeetCode-反转每对括号间的子串

245 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 24 天,点击查看活动详情

LeetCode1190:反转每对括号间的子串

给出一个字符串 s(仅含有小写英文字母和括号)。

请你按照从括号内到外的顺序,逐层反转每对匹配括号中的字符串,并返回最终的结果。

注意,您的结果中 不应 包含任何括号。

示例 1:

输入: s = "(abcd)"
输出: "dcba"

示例 2:

输入: s = "(u(love)i)"
输出: "iloveu"
解释: 先反转子字符串 "love" ,然后反转整个字符串。

示例 3:

输入: s = "(ed(et(oc))el)"
输出: "leetcode"
解释: 先反转子字符串 "oc" ,接着反转 "etco" ,然后反转整个字符串。

示例 4:

输入: s = "a(bcdefghijkl(mno)p)q"
输出: "apmnolkjihgfedcbq"

提示:

  • 1 <= s.length <= 2000
  • s 中只有小写英文字母和括号
  • 题目测试用例确保所有括号都是成对出现的

思路分析

根据题意分析:

  • 从左到右遍历该字符串,使用字符串stringBuffer记录当前层所遍历到的小写英文字母。
  • 如果是左括号,将 stringBuffer 插入到栈中,并将 stringBuffer 置为空,进入下一层。
  • 如果是右括号,则说明遍历完了当前层,需要将 stringBuffer 反转,返回给上一层。具体地,将栈顶字符串弹出,然后将反转后的 stringBuffer 拼接到栈顶字符串末尾,将结果赋值给 stringBuffer。
  • 如果是小写英文字母,将其加到 stringBuffer 末尾。

算法代码

class Solution {
    public String reverseParentheses(String s) {
        Deque < String > stack = new LinkedList < String > ();
        StringBuffer stringBuffer = new StringBuffer();
        for (int i = 0; i < s.length(); i++) {
            char ch = s.charAt(i);
            if (ch == '(') {
                stack.push(stringBuffer.toString());
                stringBuffer.setLength(0);
            } else if (ch == ')') {
                stringBuffer.reverse();
                stringBuffer.insert(0, stack.pop());
            } else {
                stringBuffer.append(ch);
            }
        }
        return stringBuffer.toString();
    }
}

结果详情

Snipaste_2023-02-27_22-46-59.png

算法复杂度

  • 空间复杂度:O(1)O(1)
  • 时间复杂度:O(n)O(n)

掘金(JUEJIN)一起进步,一起成长!