给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: "()"
输出: true
示例 2:
输入: "()[]{}"
输出: true
示例 3:
输入: "(]"
输出: false
示例 4:
输入: "([)]"
输出: false
示例 5:
输入: "{[]}"
输出: true
- 思路:
用哈希map将右括号
记录为key键
将左括号
记录为value值
第一步
如果这个是右括号,并且map里面包含这个键,则弹出栈中的左括号来匹配
第二步
如果是左括号则压入栈中
第三步
如果匹配完成后,栈中还有数据的话,则证明该字符串的符号不匹配,有多余的左括号
via LeetCode官方答案 https://leetcode-cn.com/problems/valid-parentheses/solution/you-xiao-de-gua-hao-by-leetcode/
public static boolean isValid(String s) {
HashMap<Character, Character> map = new HashMap<>();
Stack<Character> stack = new Stack<>();
map.put(')', '(');
map.put(']', '[');
map.put('}', '{');
for (int i = 0; i < s.length(); i++) {
//如果map包含的是键,即是右括号,则弹出栈顶元素判断是否匹配
if (map.containsKey(s.charAt(i))) {
char c = stack.empty() ? '#' : stack.pop(); //用#号来标记栈为空,因为没有括号可以和#相匹配
if (c != map.get(s.charAt(i))) //map 通过右括号拿出左括号来做判断,如果相等则匹配,不等则不匹配
return false;
} else {
stack.push(s.charAt(i));//把左括号压入栈
}
}
return stack.isEmpty(); // 如果栈内还有元素,则证明左括号还有多出来,但没有右括号匹配了,为空则证明匹配完成
}
网友评论