题目:
由于只包含字符的字符串'('
,')'
,'{'
,'}'
,'['
和']'
,确定输入字符串是有效的。
括号必须关闭以正确的顺序,"()"
并且"()[]{}"
都是有效的,但"(]"
并"([)]"
没有。
方法一:
思路:(1)首先将每对括号以键值对的形式添加到HashMap中,其中左半边括号为key,右半边括号为value;
(2)从给定的字符串s的第一个元素下标开始(即i=0开始),直到s的最后一个元素的下标结束(即i=s.length()-1结束),若第i个元素为左半个括号,则将其压入栈中;
若第i个元素为右半个括号,若栈为空或者弹出的栈顶元素所应的value值不等于第i个元素,则返回false;否则i++;
(3)循环执行结束,若栈为空则返回true,否则返回false
代码:
1 class Solution { 2 public boolean isValid(String s) { 3 4 HashMap<Character,Character> hm=new HashMap<Character,Character>();//创建Map用于存放括号 5 hm.put('(',')'); 6 hm.put('{','}'); 7 hm.put('[',']'); 8 9 Stack<Character> S=new Stack<Character>();//创建一个空栈 10 11 //从字符串s的首元素即i=0开始,若s的第i个元素为左半个括号则将其压栈;否则将s的第i个元素与栈顶元素相比较,若不相等则不匹配,否则i++; 12 for(int i=0;i<s.length();i++){ 13 14 if(hm.containsKey(s.charAt(i))){ 15 16 S.push(s.charAt(i)); 17 18 }else if(S.empty()||hm.get(S.pop())!=s.charAt(i)){ 19 20 return false; 21 22 } 23 } 24 25 return S.empty(); 26 27 } 28 }
方法二:
代码:
1 class Solution { 2 public boolean isValid(String s) { 3 4 Stack<Character> S=new Stack<Character>(); 5 6 for(char c:s.toCharArray()){ 7 8 if(c=='('){ 9 10 S.push(')'); 11 12 }else if(c=='{'){ 13 14 S.push('}'); 15 16 }else if(c=='['){ 17 18 S.push(']'); 19 20 }else if(S.empty()||S.pop()!=c){ 21 22 return false; 23 24 } 25 26 } 27 28 return S.empty(); 29 30 } 31 }