题目
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()"
输出:true
示例 2:输入:s = "()[]{}"
输出:true
示例 3:输入:s = "(]"
输出:false
示例 4:输入:s = "([)]"
输出:false
示例 5:输入:s = "{[]}"
输出:true来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
代码实现
package com.che.LeetCode;
import java.util.HashMap;
import java.util.Stack;
/**
* 给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
* <p>
* 有效字符串需满足:
* <p>
* 左括号必须用相同类型的右括号闭合。
* 左括号必须以正确的顺序闭合。
* <p>
* 来源:力扣(LeetCode)
* 链接:https://leetcode-cn.com/problems/valid-parentheses
* 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
*/
public class bracketsMatch {
public static void main(String[] args) {
String s = "]";
boolean valid = isValid(s);
System.out.println(valid);
}
public static boolean isValid(String s) {
Stack<Character> stack = new Stack<>();
HashMap<Character, Character> map = new HashMap<>();
map.put(')','(');
map.put(']','[');
map.put('}','{');
int i = 0;
char c;
for (; i < s.length(); i++) {
c = s.charAt(i);
if(map.containsValue(c)){
stack.push(c);
}
if(map.containsKey(c)){
if(stack.isEmpty() ||map.get(c)!= stack.peek()){
return false;
}
stack.pop();
}
}
return stack.empty();
}
}
代码分析
题目中要求匹配正确的括号,先按照括号的分组对应存入map集合中,利用栈的先进后出的特征,遍历整个字符串,如果是前括号,就直接压入栈中;如果是后括号,在栈不为空并且后括号对应的前括号就是在栈的顶端时,就将栈顶弹出,一直这样循环知道字符串中的字符判断完毕。
如果栈内没有剩余则返回true,如果有剩余就返回false。