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.最后,本题没有使用额外的存储空间,直接使用题目一开始给的数组,使得空间复杂度也较低