LeetCode1021删除最外层的括号

LeetCode1021删除最外层的括号

有效括号字符串为空 ("")、"(" + 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 是一个有效括号字符串

代码显示如下:

/*
**/
char * removeOuterParentheses(char * S){
    int len=strlen(S);
    int i=0,j=0;
    int sum=0;
    for(i=0;i<len;i++)
    {
        if(S[i]=='(')
            sum=sum+1;
        else
            sum=sum-1;
        if(S[i]=='('&&sum>1)//对内层的括号进行记录,放入最终输出
        {
            S[j]=S[i];
            j++;
        }
        else if(S[i]==')'&&sum>0)//对内层的右括号进行记录,放入最终输出
        {
            S[j]=S[i];
            j++;
        }
    }
    S[j]='\0';//内层括号少于外层括号,故需要加一个'\0'
    return S;
}

本题收获:

1.不使用栈直接进行判断
2.使用对左右括号的计数值,进行判断,左括号进行加一,右括号进行减一
  左括号是从一开始计数的,所以只要sum大于一并且确定是左括号,就加入最终输出
  右括号每次结束都是重新变为零,所以只要sum大于0并且确定是右括号就进行输出
3.由题目意思可以得到,最终要求输出的结果的符号串是小于一开始的符号串,
    故一定记得加上终结的字符
4.分析题目:
    (  (  )  (  )  )  (  (   )  )
    1  2  1  2  1  0  1   2  1  0
    根据括号的对称性可以得到'('的值大于1就开始加入,')'的值大于0就开始加入
    最终加上'\0'因为每个字符只要操作过后就不需要了,且加入的括号数量少于之前的
5.最后,本题没有使用额外的存储空间,直接使用题目一开始给的数组,使得空间复杂度也较低
发布了22 篇原创文章 · 获赞 6 · 访问量 2216

猜你喜欢

转载自blog.csdn.net/m0_38061255/article/details/104219509
今日推荐