有效括号字符串为空
("")
、"(" + 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
是一个有效括号字符串
解法一
//时间复杂度O(n), 空间复杂度O(n)
class Solution {
public:
string removeOuterParentheses(string S) {
string res;
stack<char> st;
int i = 1, len = -1;
for(char c : S) {
if(c == '(') st.push(c);
else st.pop();//')'
if(st.empty()) {
res += S.substr(i, len);
i = i + len + 2;
len = -1;
}
else len++;
}
return res;
}
};
解法二
//时间复杂度O(n), 空间复杂度O(1)
class Solution {
public:
string removeOuterParentheses(string S) {
int count = 0;
int i = 1, len = -1;
string res;
for(char c : S) {
if(c == '(') count++;
else count--;
if(count == 0) {
res += S.substr(i, len);
i = i + len + 2;
len = -1;
}
else len++;
}
return res;
}
};
解法一:
维护一个栈,遍历数组A。当遇到左括号时入栈,遇到右括号时出栈。
遍历过程中,当栈空时,对刚刚遍历过的子串,除去其左右两端的元素(这一步的实现是用了一个指针i和一个长度记录len,每次栈空时重置这两个值),将其余元素追加至res。
直到遍历完成,返回res。
解法二
解法一可以优化一下,只对其计数,并不需要额外的栈。
2019/09/04 13:25