1.タイトルの説明
有効な角かっこ文字列は空( "")、 "(" + A + ")"、またはA + Bです。ここで、AとBは有効な角かっこ文字列であり、+は文字列の連結を表します。たとえば、「」、「()」、「(())()」、「(()(()))」はすべて有効な角かっこ文字列です。
有効な文字列Sが空でなく、S = A + Bに分割する方法がない場合、それをプリミティブと呼びます。ここで、AとBは両方とも空でない有効な括弧で囲まれた文字列です。
空でない有効な文字列Sが与えられた場合、次のようにプリミティブに分解することを検討してください。S= P_1 + P_2 +…+ P_k、ここでP_iは有効な括弧で囲まれた文字列プリミティブです。
Sでプリミティブ分解を実行し、分解内の各プリミティブ文字列の最も外側の角かっこを削除して、Sを返します。
例1:
入力: "(()())(())"
出力: "()()()"
説明:
入力文字列は "(()())(())"であり、プリミティブ分解は "( ()()) "+"(()) "、各部分の最も外側の角かっこを削除して、"()() "+"() "="()()() "を取得します。
例2:
入力: "(()())(())(()(()))"
出力: "()()()()(())"
説明:
入力文字列は "(()() )(())(()(())) "、プリミティブ分解は"(()()) "+"(()) "+"(()(())) "であり
、セクションの最も外側の括弧は、 "()()" + "()" + "()(())" = "()()()()(())"になります。
例3:
入力: "()()"
出力: ""
説明:
入力文字列は "()()"であり、プリミティブ分解は "()" + "()"です。 "を
取得したら、各部分の最も外側の角かっこを削除してください。 "+" "=" "。
出典:LeetCode(LeetCode)
リンク:https://leetcode-cn.com/problems/remove-outermost-parentheses
著作権はLeetCodeが所有しています。商用転載の場合は、公認機関にご連絡ください。非商用転載の場合は、出典を明記してください。
2.解決策の
アイデア:カウントして外側の括弧を削除します。「(」、次にj ++、「)」、次にj–、j = 0、次に最も外側の「)」に遭遇した場合。
複雑さ:時間の複雑さはO(n)であり、空間の複雑さはO(1)です。
char * removeOuterParentheses(char * S){
int n=0;
for(int i=0,j=0;S[i]!='\0';i++)
{
if(S[i]=='(')
{
j++;
if(j!=1)
{
S[n++]=S[i];
}
}
else
{
j--;
if(j!=0)
{
S[n++]=S[i];
}
}
}
S[n]='\0';//结尾
return S;
}