开启掘金成长之旅!这是我参与「掘金日新计划 · 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 <= 2000s中只有小写英文字母和括号- 题目测试用例确保所有括号都是成对出现的
思路分析
根据题意分析:
- 从左到右遍历该字符串,使用字符串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();
}
}
结果详情
算法复杂度
- 空间复杂度:
- 时间复杂度:
在掘金(JUEJIN)一起进步,一起成长!