题目:
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses
思路:
可以借助栈来解决多层括号嵌套问题
1.遍历字符串,当遇到左括号时,将其入栈
2.当遇到右括号时,将其与栈顶元素进行匹配
如果匹配.则继续遍历比较下一个元素
如果不匹配,则返回false;
3.如果所有元素均遍历完,此时当栈中为空时,返回true;栈非空时,返回false;
代码:
当使用if else比较丑时,可以借助map来进行匹配
//有效的括号 力扣20
public boolean isValid(String s) {
//用栈可以解决多层括号的嵌套问题
Stack<Character> stack = new Stack<>();
Map<Character,Character> map = new HashMap<>();
map.put('(',')');
map.put('[',']');
map.put('{','}');
char [] chars = s.toCharArray();
for (int i = 0;i<chars.length;i++){
//1.依次遍历字符串,如果是左括号则入栈
if (chars[i] == '('|| chars[i] == '['||chars[i] == '{'){
stack.push(chars[i]);
continue;//取下一个字符
}
//如果当前元素已经是右括号了,但是当前栈里元素为空,
// 则意味着这个右括号没有相对应的左括号,则不合法
if (stack.empty()){
return false;
}
//2.如果是右括号,则取栈顶元素和当前右括号进行匹配
//如果为空栈,取栈顶元素就会报错,所以要先进行是否为空栈判断
Character top = stack.pop();
//若匹配,则遍历下一个元素,若不匹配,则代表整体括号匹配不成功为False
//用if else的圈复杂度较高,可以借助map
// if (chars[i] == ')' && top == '('){
// continue;
// }
// if (chars[i] == ']' && top == '['){
// continue;
// }
// if (chars[i] == '}'&& top == '{'){
// continue;
// }
if (map.get(top) == chars[i]){
continue;
}
//如果上述合法情况都不满足,则意味着不合法
return false;
}
//若所有字符串均遍历结束,如果栈为空,则表示true,若栈中还有元素就意味不合法.
if (stack.empty()){
return true;
}
return false;
}