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<char> mystack;
string res = "";
for(int i = 0; i < S.size(); i++){
if(S[i]==')') mystack.pop();
if(!mystack.empty()) res+=S[i];
if(S[i]=='(') mystack.push('(');
}
return res;
}
};
分析
通过理解题意可知,目的是去除最外层的一对括号即可
当遍历到最外的一对括号的右括号时,此时的栈应该为空,那么我们分解的第一个P_1也就结束了,所以当且仅当栈为空时,新匹配的一对括号不用输出
输入示例:"(()())(())"
栈和存储字符串的关系
mystack | res |
---|---|
( | null |
(( | ( |
( | () |
(( | ( |
( | ()() |
null | ()() |
( | ()() |
(( | ()()( |
( | ()()() |
null | ()()() |
一定要注意循环时判断的 if 语句的顺序,弹栈、判空、入栈的顺序不能错