元のタイトル:
「(」、「)」、「{」、「}」、「[」、「]」のみを含む文字列を指定して、文字列が有効かどうかを判断します。
有効な文字列は次の条件を満たす必要があります。
左ブラケットは、同じタイプの右ブラケットで閉じる必要があります。
左ブラケットは正しい順序で閉じる必要があります。
空の文字列は有効な文字列と見なすことができることに注意してください。
問題解決のアイデア:
観察により、有効な括弧には少なくとも左右の括弧のグループが隣接しており、隣接する左右の括弧で構成される部分文字列を削除して残りの部分の有効性を判断できることがわかります。(これは数学の問題を自分で計算するようなものです。通常、最も深い括弧が最初に計算され、次に次のレイヤーの括弧が最後のレイヤーまで計算されます。)具体的な解決策のアイデアは次のとおりです。
1.右括弧と左括弧の間のマッピングを作成します。
2.スタックを構築し、文字列をトラバースし、左側のブラケットを見つけてスタックに配置し、右側のブラケットを、手順1のマッピング関係に従って、スタック上部のブラケットと右側のブラケットが有効なブラケットを形成しているかどうかを判断します。構成、直接falseを返します。有効な場合は、スタックの一番上の要素をポップしてトラバースを続行します(スタックのデータ構造は先入れ先出しなので、トラバースされた角かっこ文字を格納するためにスタックが使用されます)。
3.最終スタックが空かどうかを確認します空でない場合は、有効なブラケットではありません。
解決策:
1 クラスSolution { 2 public static boolean isValid(String s){ 3 HashMap <Character、Character> maps = new HashMap <> (); 4 int len = s.length(); 5 if(len%2!= 0)return false ; //长度是奇数、直接返還false 6 maps.put( ')'、 '(' ); 7 maps.put( '}'、 '{' ); 8 maps.put( ']'、 '[' ); 9 Stack <Character>スタック= 新しい Stack <Character> (); for(int i = 0; i <s.length(); i ++ ){ 11 char c = s.charAt(i); 12 if (maps.containsKey(c)){ 13 char topElement = stack.empty()?'#' :stack.pop(); 14 if(topElement!= maps.get(c)){ 15 return false ; 16 } 17 } else { 18 stack.push(c); 19 } 20 } 21 return stack.isEmpty(); 22 } 23 }