当前位置: 代码迷 >> 综合 >> LeetCode-1021:删除最外层的括号
  详细解决方案

LeetCode-1021:删除最外层的括号

热度:61   发布时间:2023-12-14 00:24:52.0

有效括号字符串为空 ("")、"(" + 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的情况。我们的算法处理过程,示例如下:
LeetCode基础算法题第146篇:删除最外面的括号
我们定义一个数组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 = 0i = 1result = ""while i<len(S)-1:if S[i] == '(':flag += 1else:flag -= 1if flag == -1:i += 2flag = 0continueresult += S[i]i += 1return result