题目描述 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。
示例 1:
示例 2:
示例 3:
示例 4:
示例 5:
解题思路 
使用stack 
遍历字符串 
如果当前字符为左半边括号是,则将其压入栈中 
如果是右括号时,分类讨论:
如栈不为空且为对应的左半边括号,则取出栈顶元素,继续循环 
若此时栈为空,则直接返回false 
若不为对应的左半边括号,返回false 
 
 
 
图解 
示例代码 java 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 31 public  static  boolean  isValid (String s) if  (!StringUtils.hasText(s)) return  false ;new  Stack<>();char [] chars = s.toCharArray();new  HashMap<>();'(' ,')' );'[' ,']' );'{' ,'}' );for  (char  aChar : chars) {if  (map.containsKey(aChar)){else  {if  (stack.size() != 0 ){if  (!map.get(pop).equals(aChar)){return  false ;else  {continue ;else  {return  false ;return  stack.isEmpty();
js 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 var  isValid = function (s ) let  valid = true ;const  stack = [];const  mapper = {'{' : "}" ,"[" : "]" ,"(" : ")" for (let  i in  s) {const  v = s[i];if  (['(' , '[' , '{' ].indexOf(v) > -1 ) {else  {const  peak = stack.pop();if  (v !== mapper[peak]) {return  false ;if  (stack.length > 0 ) return  false ;return  valid;
python 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 class  Solution :def  isValid (self,s) :"{" :"}" ,"[" :"]" ,"(" :")" for  x in  s:if  x in  map:else :if  len(stack)!=0 :if  x != top_element:return  False else :continue else :return  False return  len(stack) == 0 
扩展 以上的代码只能针对左右完全对应上,并且中间不能出现任何字符,所以这里我想拓展一下,就像代码中一样,括号能对应上并且中间有代码;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 public  static  boolean  isValid (String s) if  (!StringUtils.hasText(s)) return  false ;new  Stack<>();char [] chars = s.toCharArray();new  HashMap<>();'(' ,')' );'[' ,']' );'{' ,'}' );for  (char  aChar : chars) {if  (map.containsKey(aChar)){else  {if  (stack.size() != 0  && map.containsValue(aChar)){if  (!map.get(pop).equals(aChar)){return  false ;else  {continue ;return  stack.isEmpty();
输入:
输出: