给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: "()"
输出: true
示例 2:
输入: "()[]{}"
输出: true
示例 3:
输入: "(]"
输出: false
示例 4:
输入: "([)]"
输出: false
示例 5:
输入: "{[]}"
输出: true
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
运用栈的方法,每次往栈中新增元素的时候,从栈底往栈顶增长,先来的元素在栈底,后来的元素在栈顶,先出去的元素是栈顶元素,栈底元素最后才能出去,遍历字符串依次取出每个字符:
- 如果当前字符是左括号( [ {,就把当前的字符入栈
- 如果当前字符是右括号,取出栈顶元素,看看栈顶元素和当前括号类型是否匹配;如果类型匹配,把栈顶元素出栈,继续取下一个字符;如果类型不匹配,直接判定成非法,返回 false
- 遍历完整个字符串,看栈中的内容是否为空;空栈就说明合法,否则就是非法
有了栈就能帮我们处理好,多层括号嵌套的情况
代码实现
import java.util.Stack;
public class Solution {
public boolean isValid(String s) {
//先创建一个类
Stack<Character> stack = new Stack<>();
//循环遍历字符串中的每个字符
for (int i = 0;i <s.length();i++){
char c = s.charAt(i);
//判定 c 是否是左括号,如果是左括号就入栈
if (c == '(' || c == '[' || c == '{'){
stack.push(c);
//进入下次循环,取出下一个字符
continue;
}
if (stack.empty()){
//如果发现当前字符不是左括号,并且栈为空,说明字符串违法
//这种情况说明前面没有合适的左括号和当前括号匹配
return false;
}
//判定 c 是否是右括号,如果是,就取出栈顶元素进行对比
char top = stack.pop();
if (top == '(' && c == ')'){
continue;
}
if (top == '[' && c == ']'){
continue;
}
if (top == '{' && c == '}'){
continue;
}
//除了上面的三种合法情况,剩下的都是非法的
return false;
}
//遍历完字符串后看栈是否为空
if (stack.empty()){
return true;
}
return false;
}
}
还可以用 Map 来优化代码
import java.util.HashMap;
import java.util.Map;
import java.util.Stack;
public class Solution_2 {
public boolean isValid(String s) {
Stack<Character> stack = new Stack<>();
Map<Character,Character> map = new HashMap<>();
map.put('(',')');
map.put('{','}');
map.put('[',']');
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c == '(' || c == '{' || c== '['){
stack.push(c);
continue;
}
if (stack.empty()){
return false;
}
char top = stack.pop();
if (map.get(top) == c){
continue;
}
return false;
}
if (stack.empty()){
return true;
}
return false;
}
}