LeetCode-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 是一个有效括号字符串

代码实现
C++:

题目描述说S一定是一个有效的括号字符串。所以不考虑无效的情况。

如果S长度小于等于2的话,这是一种特殊特殊情况,S只能是“”或者“()”,所以结果都会返回“”。

S长度超过2的情况。我们的算法处理过程,示例如下:
LeetCode-1021:删除最外层的括号
我们定义一个数组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
上一篇:1021 个位数统计 (15 分)


下一篇:18. javacript高级程序设计-JavaScript与XML