有效括号字符串为空 ("")、"(" + 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 是一个有效括号字符串
代码实现
C++:
题目描述说S一定是一个有效的括号字符串。所以不考虑无效的情况。
如果S长度小于等于2的话,这是一种特殊特殊情况,S只能是“”或者“()”,所以结果都会返回“”。
S长度超过2的情况。我们的算法处理过程,示例如下:
我们定义一个数组res用来存放返回的字符串。
S的第一个字符一定是‘(’,且它一定是一个“原有效括号字符串”最外面的左括号,是要删掉的,不能放到res中。所以我们从第二个字符开始遍历S。
在此之前我们还需要定义一个整形变量c来统计状态:如果遇到左括号就加1,遇到右括号减1,c初始化为0。
同时我们要检查c的值,如果c不等于-1就将当前字符追加到res中。
为什么要这么做?
因为括号是成对出现的,且跳过了“原有效括号字符串”最外面的左括号,所以当遇到“原有效括号字符串”最外面的右括号的时候,c应该是-1。这个时候我们就知道一个"原有效括号字符串"遍历结束。再用同样的方法遍历下一个"原有效括号字符串"。
我们用上图的示例来说明整个算法流程。
第一步:遇到左括号,c加1,因为遇到左括号,c始终是加的,不可能为负值,所以不用判断c的值,直接将当前字符追加到res中去;
第二步:遇到右括号,c减1,由于是减,c有可能为负的,所以要判断c的值。c=0,所以继续追加;
第三步:遇到右括号,c减1,判断c的值,为-1,说明一个“原有效括号字符串”遍历结束。不追加;
第四步: 开始遍历一个新的“原有效括号字符串”,所以这个字符要跳过;
第五步:遇到左括号,c加1,追加;
第六步:遇到右括号,c减1,判断c的值,为0,追加;
第七步:遇到右括号,c减1,判断c的值,为-1,说明一个“原有效括号字符串”遍历结束。实际上这一步不用做,因为字符串最后面一个字符,是“原有效括号字符串”最外面的右括号,我们是不需要的,可以直接跳过;
具体代码如下:
class Solution {
public:
string removeOuterParentheses(string S) {
string result = "";
int flag=0;
//跳过第一个字符,因为第一个字符肯定是最外层括号
int strLength = S.length();
if(strLength <= 2){
return result;
}
for(int i=1; i<strLength-1; i++)
{
//如果字符等于左括号
if(S[i] == '('){
flag++;
}
else{
flag--;
//如果当flag==-1时, 一定扫描到了最外层右括号
if(flag == -1){
flag=0;
//跳过一个字符,直接跳转到下一个整句的第二个字符
i++;
continue;
}
}
result += S[i];
}
return result;
}
};
Python:
class Solution(object):
def removeOuterParentheses(self, S):
"""
:type S: str
:rtype: str
"""
if len(S) <= 2:
return ""
flag = 0
i = 1
result = ""
while i<len(S)-1:
if S[i] == '(':
flag += 1
else:
flag -= 1
if flag == -1:
i += 2
flag = 0
continue
result += S[i]
i += 1
return result