给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解:
运用栈
遍历字符串依次取出每个字符
- 如果当前字符是左括号,就把当前字符入栈
- 如果当前字符是右括号,取出栈顶元素,看栈顶元素和当前括号类型是否匹配
- 如果类型匹配,栈顶元素出栈(用pop),继续取下一个字符
- 如果类型不匹配,直接判定成非法,return false即可
- 当遍历完整个字符串之后,就看栈中的内容是否为空栈,如果为空就是合法的,反之,非法.
代码如下:
public boolean isValid(String s) {
Map<Character,Character> map = new HashMap<>();
map.put('(',')');
map.put('{','}');
map.put('[',']');
//1.创建一个栈,栈里保存字符类型
Stack<Character> stack = new Stack<>();
//2.循环遍历字符串中的每个字符
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
//3.判断 c 是否为左括号,如果是左括号,就入栈
//单引号表字符;双引号表String
if (c == '(' || c == '[' || c == '{') {
stack.push(c);
continue;//进入下次循环,取出下一个字符
}
if (stack.empty()) {
//如果发现当前字符不是左括号,并且栈又为空,此时也就说明字符串非法
//当前情况说明,之前没有合适的左括号和当前括号匹配
return false;
}
//4.判定 c 是否为右括号,如果是右括号,就取栈顶元素对比一下
char top = stack.pop(); //pop即可以return出栈顶元素,也可以出栈
if (map.get(top) == c) {
continue;
}
//除了上面三种合法情况,剩下的都是非法情况
return false;
}
//遍历完字符串之后,还要看栈是否为空,空栈才能是合法的字符串
if (stack.empty()) {
return true;
}
return false;
}