题目
力扣 20 有效的符号
题目描述
给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入:s = “()”
输出:true
示例 2:
输入:s = “()[]{}”
输出:true
示例 3:
输入:s = “(]”
输出:false
提示:
1 <= s.length <= 104
s 仅由括号 ‘()[]{}’ 组成
题解
思路
使用栈的方法
- 左括号入栈,遇到右括号时,将对应栈顶的左括号 出栈 ,遍历完所有符号之后 栈依然为空
- 使用Map 建立 符号的对应关系 key 为左括号,value 为右括号
- 如果 当前符号 是左括号,则入栈 push;
- 否则通过Map判断括号对应关系,若 stack 栈顶 出栈括号 与当前遍历括号 不对应,则提前返回 false
栈的方法
1.push() : 入栈把一个元素放入栈中
2.pop() : 出栈把栈顶元素移除(删除掉) 同时也会返回被删除的值
3.peek() : 得到栈顶的一个元素
4.empty() : 判断栈是否为空 如果为空返回 true 不为空返回 false
5.serch() : 查询一个值在栈中的位置
public static boolean isValid(String s) {
Map<Character, Character> map = new HashMap<Character, Character>() {{
put('(', ')');
put('{', '}');
put('[', ']');
put('?', '?');
}};
int n = s.length();
if (n % 2 == 1) {
return false;
}
if (n > 0 && !map.containsKey(s.charAt(0)))
return false; //判断字符串的第一个字符是否在 题意描述中
LinkedList<Character> stack = new LinkedList<Character>() {{
add('?');
}};
//循环出每个字符
for (Character c : s.toCharArray()) {
if (map.containsKey(c)) {
stack.addLast(c); //如果包含左括号就进栈
} else if (map.get(stack.removeLast()) != c) {
return false;
}
}
return stack.size() == 1;
}
//写法2
public static boolean isValid2(String s) {
if (s.isEmpty())
return true;
Stack<Character> stack = new Stack<Character>();
for (char c : s.toCharArray()) {
if (c == '(')
stack.push(')');
else if (c == '{')
stack.push('}');
else if (c == '[')
stack.push(']');
else if (stack.empty() || c != stack.pop())
return false;
}
return stack.empty();
}