LeetCode1021削除最も外側の括弧
有効な文字列が空の括弧(「」)であり、「(」+ A +「)」又はA及びBは、括弧文字列に有効であるA + Bは、+接続の文字列を表します。たとえば、 ""、 "()"、 "(())()" と "(()(()))" カッコ内の有効な文字列です。
有効な文字列が空S、およびそれがAとBが非空の文字列が効果的にカッコであることを特徴とする請求我々は(プリミティブ)プリミティブを呼び出すS = A + B、方法にあっ壊れている場合。
S = P_1 + P_2 + ... + P_k、ブラケットがプリミティブ有効な文字列であることを特徴とする請求P_I:NULL以外の有効な文字列Sを考えると、それはそうすることを、原始的な分解とみなされます。
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.最后,本题没有使用额外的存储空间,直接使用题目一开始给的数组,使得空间复杂度也较低