题目描述 给定一个只包括 ‘(‘,’)’,’{‘,’}’,’[‘,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。 
左括号必须以正确的顺序闭合。 
每个右括号都有一个对应的相同类型的左括号。 
 
示例 1: 
输入:s = “()”
 
示例 2: 
输入:s = “()[]{}”
 
示例 3: 
输入:s = “(]”
 
提示: 
$1 <= s.length <= 10^4$ 
s 仅由括号 ‘()[]{}’ 组成 
 
解决方法 C++ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 class  Solution  {public :    bool  isValid (string s)           stack<char > stack;         unordered_map<char , char > mapping = {             {')' , '(' },             {']' , '[' },             {'}' , '{' }         };         for  (char & c : s) {             if  (mapping.find (c) != mapping.end ()) {                 char  top_element = stack.empty () ? '#'  : stack.top ();                 stack.pop ();                 if  (top_element != mapping[c]) {                     return  false ;                 }             } else  {                 stack.push (c);             }         }         return  stack.empty ();     } }; 
结果 执行用时 : 4 ms, 击败 34.94% 使用 C++ 的用户
内存消耗 : 6.66 MB, 击败 20.29% 使用 C++ 的用户
Java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 class  Solution  {    public  boolean  isValid (String s)  {         Stack<Character> stack = new  Stack <>();         HashMap<Character, Character> mapping = new  HashMap <>();         mapping.put(')' , '(' );         mapping.put(']' , '[' );         mapping.put('}' , '{' );         for  (char  c : s.toCharArray()) {             if  (mapping.containsKey(c)) {                 char  topElement  =  stack.isEmpty() ? '#'  : stack.pop();                 if  (topElement != mapping.get(c)) {                     return  false ;                 }             } else  {                 stack.push(c);             }         }         return  stack.isEmpty();     } } 
结果 执行用时 : 2 ms, 击败 51.90% 使用 Java 的用户
内存消耗 : 40.38 MB, 击败 15.69% 使用 Java 的用户
Python 1 2 3 4 5 6 7 8 9 10 11 12 class  Solution (object ):    def  isValid (self, s ):         stack = []         mapping = {')' : '(' , '}' : '{' , ']' : '[' }         for  char in  s:             if  char in  mapping:                 top_element = stack.pop() if  stack else  '#'                  if  mapping[char] != top_element:                     return  False              else :                 stack.append(char)         return  not  stack 
结果 执行用时 : 24 ms, 击败 28.80% 使用 Python 的用户
内存消耗 : 13.06 MB, 击败 58.31% 使用 Python 的用户
Python3 1 2 3 4 5 6 7 8 9 10 11 12 class  Solution :    def  isValid (self, s: str  ) -> bool :         stack = []         mapping = {')' : '(' , '}' : '{' , ']' : '[' }         for  char in  s:             if  char in  mapping:                 top_element = stack.pop() if  stack else  '#'                  if  mapping[char] != top_element:                     return  False              else :                 stack.append(char)         return  not  stack 
结果 执行用时 : 32 ms, 击败 97.63% 使用 Python3 的用户
内存消耗 : 16.83 MB, 击败 16.72% 使用 Python3 的用户
C 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 bool  isValid (char * s)  {    int  len = strlen (s);     char  stack [len];     int  top = -1 ;     for  (int  i = 0 ; i < len; i++) {         if  (s[i] == '('  || s[i] == '['  || s[i] == '{' ) {             stack [++top] = s[i];         } else  {             if  (top == -1 ) {                 return  false ;             }             char  temp = stack [top--];             if  ((s[i] == ')'  && temp != '(' ) || (s[i] == ']'  && temp != '[' ) || (s[i] == '}'  && temp != '{' )) {                 return  false ;             }         }     }     return  top == -1 ; } 
结果 执行用时 : 4 ms, 击败 41.72% 使用 C 的用户
内存消耗 : 6.13 MB, 击败 89.19% 使用 C 的用户
C# 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 public  class  Solution  {    public  bool  IsValid (string  s         if  (string .IsNullOrEmpty(s)) return  true ;         Stack<char > stack = new  Stack<char >();         Dictionary<char , char > mapping = new  Dictionary<char , char > {{')' , '(' }, {']' , '[' }, {'}' , '{' }};         foreach  (char  c in  s) {             if  (mapping.ContainsValue(c)) {                 stack.Push(c);             } else  if  (mapping.TryGetValue(c, out  char  value )) {                 if  (stack.Count == 0  || stack.Pop() != value ) {                     return  false ;                 }             }         }         return  stack.Count == 0 ;     } } 
结果 执行用时 : 56 ms, 击败 95.95% 使用 C# 的用户
内存消耗 : 38.44 MB, 击败 12.55% 使用 C# 的用户
JavaScript 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 var  isValid = function (s ) {    if  (s.length  === 0 ) return  true ;     const  stack = [];     const  mapping = {')' : '(' , ']' : '[' , '}' : '{' };     for  (let  i = 0 ; i < s.length ; i++) {         const  char = s[i];         if  (mapping[char] !== undefined ) {             const  topElement = stack.length  === 0  ? '#'  : stack.pop ();             if  (mapping[char] !== topElement) {                 return  false ;             }         } else  {             stack.push (char);         }     }     return  stack.length  === 0 ; }; 
结果 执行用时 : 64 ms, 击败 71.45% 使用 JavaScript 的用户
内存消耗 : 48.31 MB, 击败 12.49% 使用 JavaScript 的用户
TypeScript 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 function  isValid (s : string boolean  {    if  (s.length  === 0 ) return  true ;     const  stack : string [] = [];     const  mapping : { [key : string ]: string  } = {')' : '(' , ']' : '[' , '}' : '{' };     for  (let  i = 0 ; i < s.length ; i++) {         const  char = s[i];         if  (mapping[char] !== undefined ) {             const  topElement = stack.length  === 0  ? '#'  : stack.pop ()!;             if  (mapping[char] !== topElement) {                 return  false ;             }         } else  {             stack.push (char);         }     }     return  stack.length  === 0 ; } 
结果 执行用时 : 68 ms, 击败 64.87% 使用 TypeScript 的用户
内存消耗 : 51.40 MB, 击败 6.85% 使用 TypeScript 的用户
PHP 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 class  Solution                function  isValid ($s          if  (empty ($s )) return  true ;         $stack  = [];         $mapping  = [')'  => '(' , ']'  => '[' , '}'  => '{' ];         for  ($i  = 0 ; $i  < strlen ($s ); $i ++) {             $char  = $s [$i ];             if  (array_key_exists ($char , $mapping )) {                 $topElement  = empty ($stack ) ? '#'  : array_pop ($stack );                 if  ($mapping [$char ] !== $topElement ) {                     return  false ;                 }             } else  {                 array_push ($stack , $char );             }         }         return  empty ($stack );     } } 
结果 执行用时 : 8 ms, 击败 63.54% 使用 PHP 的用户
内存消耗 : 19.52 MB, 击败 6.25% 使用 PHP 的用户
Swift 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 class  Solution  {    func  isValid (_  s : String ) -> Bool  {         if  s.isEmpty {             return  true          }         var  stack =  [Character ]()         let  mapping: [Character : Character ] =  [")" : "(" , "]" : "[" , "}" : "{" ]         for  char in  s {             if  let  leftBracket =  mapping[char] {                 if  stack.isEmpty ||  stack.popLast() !=  leftBracket {                     return  false                  }             } else  {                 stack.append(char)             }         }         return  stack.isEmpty     } } 
结果 执行用时 : 0 ms, 击败 100.00% 使用 Swift 的用户
内存消耗 : 15.52 MB, 击败 5.91% 使用 Swift 的用户
Kotlin 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 class  Solution  {    fun  isValid (s: String ) Boolean  {         if  (s.isEmpty()) {             return  true          }         val  stack = Stack<Char >()         val  mapping = mapOf(')'  to '(' , ']'  to '[' , '}'  to '{' )         for  (char in  s) {             if  (mapping.containsKey(char)) {                 val  topElement = if  (stack.isEmpty()) '#'  else  stack.pop()                 if  (mapping[char] != topElement) {                     return  false                  }             } else  {                 stack.push(char)             }         }         return  stack.isEmpty()     } } 
结果 执行用时 : 148 ms, 击败 66.67% 使用 Kotlin 的用户
内存消耗 : 33.78 MB, 击败 44.17% 使用 Kotlin 的用户
Dart 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 class  Solution    bool  isValid(String  s) {     if  (s.isEmpty) return  true ;     final  Map <String , String > mapping = {')' : '(' , ']' : '[' , '}' : '{' };     final  List <String > stack = [];     for  (int  i = 0 ; i < s.length; i++) {       String  char = s[i];       if  (mapping.containsKey(char)) {         String  topElement = stack.isEmpty ? '#'  : stack.removeLast();         if  (mapping[char] != topElement) {           return  false ;         }       } else  {         stack.add(char);       }     }     return  stack.isEmpty;   } } 
结果 执行用时 : 256 ms, 击败 85.71% 使用 Dart 的用户
内存消耗 : 147.11 MB, 击败 100.00% 使用 Dart 的用户
Go 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 func  isValid (s string ) bool  {    if  len (s) == 0  {         return  true      }     mapping := map [rune ]rune {         ')' : '(' ,         ']' : '[' ,         '}' : '{' ,     }     stack := []rune {}     for  _, char := range  s {         if  val, ok := mapping[char]; ok {             var  topElement rune              if  len (stack) == 0  {                 topElement = '#'              } else  {                 topElement, stack = stack[len (stack)-1 ], stack[:len (stack)-1 ]             }             if  val != topElement {                 return  false              }         } else  {             stack = append (stack, char)         }     }     return  len (stack) == 0  } 
结果 执行用时 : 0 ms, 击败 100.00% 使用 Go 的用户
内存消耗 : 1.93 MB, 击败 16.11% 使用 Go 的用户
Ruby 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 def  is_valid (s )    return  true  if  s.empty?     mapping = { ')'  => '(' , ']'  => '[' , '}'  => '{'  }     stack = []     s.each_char do  |char |         if  mapping.key?(char)             top_element = stack.empty? ? '#'  : stack.pop             return  false  if  mapping[char] != top_element         else              stack.push(char)         end      end      stack.empty? end 
结果 执行用时 : 80 ms, 击败 16.67% 使用 Ruby 的用户
内存消耗 : 206.79 MB, 击败 8.33% 使用 Ruby 的用户
Scala 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 import  scala.collection.mutable.Stack object  Solution    def  isValid String ): Boolean  = {     if  (s.isEmpty) return  true      val  mapping = Map (')' -> '(', ']' -> '[', '}' -> '{')     val  stack = Stack [Char ]()     for  (char <- s) {       if  (mapping.contains(char)) {         val  topElement = if  (stack.isEmpty) '#' else  stack.pop()         if  (mapping(char) != topElement) {           return  false          }       } else  {         stack.push(char)       }     }     stack.isEmpty   } } 
结果 执行用时 : 492 ms, 击败 28.00% 使用 Scala 的用户
内存消耗 : 55.64 MB, 击败 84.00% 使用 Scala 的用户
Rust 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 impl  Solution  {    pub  fn  is_valid (s: String ) ->  bool  {         if  s.is_empty () {             return  true ;         }         let  mut  stack  = Vec ::new ();         let  mapping : Vec <(char , char )> = vec! [('(' , ')' ), ('[' , ']' ), ('{' , '}' )];         for  c  in  s.chars () {             match  c {                 '('  | '['  | '{'  => stack.push (c),                 _ => {                     if  let  Some (&top) = stack.last () {                         if  let  Some (&(_, close)) = mapping.iter ().find (|&&(open, _)| open == top) {                             if  close == c {                                 stack.pop ();                             } else  {                                 return  false ;                             }                         } else  {                             return  false ;                         }                     } else  {                         return  false ;                     }                 }             }         }         stack.is_empty ()     } } 
结果 执行用时 : 0 ms, 击败 100.00% 使用 Rust 的用户
内存消耗 : 2.03 MB, 击败 65.16% 使用 Rust 的用户
Racket 1 2 3 4 5 6 7 8 9 10 11 12 13 (define/contract  (is-valid  s)   (->  string? boolean?)   (if string=? "" ) #t        (let s  (string->list stack  '()))         (cond            ((null? null?            ((member car #\(  #\[  #\{ )) (loop  (cdr cons car            ((and member car #\)  #\]  #\} )) (not null? char=? car                                                                                 (cond char=? car #\( ) #\) )                                                                                      ((char=? car #\[ ) #\] )                                                                                      ((char=? car #\{ ) #\} )))                                                  (loop  (cdr cdr            (else #f ))))) 
结果 执行用时 : 188 ms, 击败 100.00% 使用 Racket 的用户
内存消耗 : 98.05 MB, 击败 100.00% 使用 Racket 的用户
Erlang 暂时未解决
结果 执行用时 :  ms, 击败 % 使用 Erlang 的用户
内存消耗 :  MB, 击败 % 使用 Erlang 的用户
Elixir 暂时未解决
结果 执行用时 :  ms, 击败 % 使用 Elixir 的用户
内存消耗 :  MB, 击败 % 使用 Elixir 的用户