leetcode分类下所有的题解均为作者本人经过权衡后挑选出的题解,在易读和可维护性上有优势
每题只有一个答案,避免掉了太繁琐的以及不实用的方案,所以不一定是最优解
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: "()" 输出: true
示例 2:
输入: "()[]{}" 输出: true
示例 3:
输入: "(]" 输出: false
示例 4:
输入: "([)]" 输出: false
示例 5:
输入: "{[]}" 输出: true
class Solution {
public boolean isValid(String s) {
Map<Character,Character> map = new HashMap<Character,Character>();
map.put('(',')');
map.put('[',']');
map.put('{','}');
Stack<Character> stack = new Stack<Character>();
for(Character c : s.toCharArray()){
if(map.containsKey(c))
stack.push(map.get(c));
else if(stack.isEmpty() || c != stack.pop())
return false;
}
if(!stack.isEmpty())
return false;
return true;
}
}
思路:
- 先在map中,将左右括号对应存放起来
- 维护一个stack,for循环遍历每一个char,containsKey了,就push到stack(后进先出)
- map不包含的话,可能是除括号外的其他字符(此时看stack是否为空,为空就false了)
- 判断右边括号,则需要看c != stack.pop()是否成立,成立就false了,这是按照顺序来判断的
- 不要忘了遍历完所有的char后如果stack还有元素,那就说明左括号多了,就是false