グラフィカルな LeetCode - 921. 括弧を効果的にするための最小限の追加 (難易度: 中)

創造し続け、成長を加速!「ナゲッツデイリー新プラン・10月アップデートチャレンジ」参加7日目、イベント詳細はこちら

1. トピック

角かっこで囲まれた文字列は、次のいずれかに該当する場合にのみ有効です。

  • 空の文字列、または
  • AB 記述(A および B 連結) できます 。ここでA、 と B は両方とも有効な文字列です。
  • は  有効な文字列です(A)。 A

角かっこで囲まれた string が与えられた場合、sそれを N 回移動すると、文字列のどこにでも角かっこを挿入できます。

たとえば、 の場合s = "()))"、開き括弧を として挿入し"(()))"たり、"())))"

結果の文字列をs 有効。

2. 例

2.1> 例 1:

【入力】s = "())"
【出力】1

2.2> 例 2:

【入力】s = "((("
【出力】3

ヒント:

  • 1<= s.length <=1000
  • s'('および ')' 文字のみが含まれます 。

3、問題解決のアイデア

这道题的题目描述真的挺让人费解的。其实题目的意思就是,我们如果想要配对好所有的括号,需要在原有字符串s的基础上,添加多少个括号(可能是左括号、也可能是右括号)。那么针对于这种配对类型类型的题目,第一个想法就是使用堆栈来实现。当然,对于括号配对的特殊性,即:左括号 + 右括号 。我们也可以根据这个规律去计算。如下是两种解题算法的详细解释。

3.1> 思路1:利用栈特性去计算

我们可以通过对字符串s进行每个字符的遍历,放到堆栈中。当发现栈顶字符是‘(’,待入栈的字符是‘)’,则符合括号匹配的情况。那么,此时我们只需将栈顶字符出栈即可。而针对于其他情况,我们都是将遍历的字符入栈即可。那么字符串s遍历完毕之后,我们来调用size()方法计算存储的字符长度,返回的长度就是这道题的结果。具体逻辑如下图所示:

针对该思路的代码实现,请参见:代码实现 4.1> 利用栈特性去计算

3.2> 思路2:找规律去匹配

合格問題の【ヒント】s'(' ')' 文字のみです。したがって、2文字のマッチングには、下図のように4つのケースがあります。すると、[case 1] のみが一致し、それ以外は一致しません。leftCount次に、(左括弧の数) とrightCount(右括弧の数)という 2 つの変数を作成します。

  • トラバースされた文字が左括弧の場合、実行leftCount++
  • トラバースされた文字が閉じ括弧で、leftCount が 0 でない場合、実行しますleftCount--
  • トラバースされた文字が閉じ括弧で、leftCount が 0の場合、実行しますrightCount++

このアイデアのコード実装については、次を参照してください:コード実装 4.2> 一致するルールを見つける

第四に、コードの実装

4.1> 実装 1: スタック機能を使用して計算する

class Solution {
    public int minAddToMakeValid(String s) {
        Deque<Character> deque = new ArrayDeque();
        for (char sc : s.toCharArray()) {
            if (deque.size() != 0 && (deque.peekLast()).equals('(') && sc == ')') deque.removeLast();
            else deque.addLast(sc);
        }
        return deque.size();
    }
}
复制代码

4.2> 実現 2: 一致するルールを見つける

class Solution {
    public int minAddToMakeValid(String s) {
        int leftCount = 0, rightCount = 0;
        for (char item : s.toCharArray()) {
            if (item == '(') {
                leftCount++;
            } else {
                if (leftCount == 0) rightCount++;
                else leftCount--;
            }               
        }
        return leftCount + rightCount;
    }
}
复制代码

今日の記事は以上です。

執筆は簡単ではありません. 著者によって数時間または数日で完成された記事は、あなたからの数秒いいねとシェアと交換されるだけです.

よりテクニカルな乾物については、公開アカウント「Java Muse」に注目してください〜\(^o^)/〜「乾物共有、毎日更新」

おすすめ

転載: juejin.im/post/7150464878791098375