最も外側の括弧のエンドレス削除アルゴリズム

有効な文字列が空の括弧(「」)であり、「(」+ 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は、有効な文字列であるブラケット

ソリューション:

最初の方法:結果に加算するときの脳は、それは潮の干満そうでなければ、追加しますん

class Solution {
    public String removeOuterParentheses(String S) {
        int count=0;
        String result="";
        for(char c: S.toCharArray()){
            if(c=='('){
                count++;
                if(count>1)
                    result=result+"(";
            }else{
                if(count>1){
                    result=result+")";
                }
                count--;
            }
        }
        return result;
    }
}

方法2:

アイデア:スタック出会い左括弧、スタックに遭遇した右括弧の上、各スタックが空であるトラバースの文字列、すべての命令は、各プリミティブの原始記録開始位置と終了位置を特定します、彼らはプリミティブプリミティブに位置+1を開始ストリングの最後に位置を縫い合わせる、元の文字列プリミティブの削除最も外側の括弧文字列を取らなければならないだろう、答えを解決することができます。

詳細コード+注:
class Solution {
    public String removeOuterParentheses(String S) {
        StringBuilder ans = new StringBuilder();
        Stack<Character> stack = new Stack<>();

        int start = 0;// 初始化原语的起始位置
        int end = 0;// 初始化原语的结束位置
        boolean flag = false;// 标志每个原语

        for (int i = 0;i < S.length();i++) {
            char ch = S.charAt(i);

            if (ch == '(') {// 遇到左括号,入栈
                stack.push(ch);
                if (!flag) {// 遇到的第一个左括号,是原语的开始位置,记录下原语开始位置
                    start = i;
                    flag = true;
                }
            }

            if (ch == ')') {// 遇到右括号,出栈
                stack.pop();
                if (stack.isEmpty()) {// 当栈空的时候,找到了一个完整的原语
                    end = i;// 记录下结束位置
                    ans.append(S.substring(start + 1,end));// 去掉原语的最外层括号,并追加到答案中
                    flag = false;// 置标志为false,往后接着找下一个原语
                    start = end;// 往后找,再次初始化原语开始位置
                }
            }
        }

最後に、自分自身を書くための第三奇妙な方法を添付

class Solution {
    public String removeOuterParentheses(String S) {
        int count=0;
        char[] arr= S.toCharArray();
       	String result="";
       	for(int i=0; i<arr.length; i++){
           	if(arr[i]=='('){
                count++;
            }
            if(arr[i]==')'){
                count--;
            }   
            if(count==0&&arr[i]==')'){
               arr[i]='_';
            }if(count==1&&arr[i]=='('){
               arr[i]='_';
            }
    	}
    result= String.valueOf(arr);
    result=result.replace("_","");
    return result;
    }
}
公開された125元の記事 ウォンの賞賛236 ・は 20000 +を見て

おすすめ

転載: blog.csdn.net/qq_33709508/article/details/103855948