leetcode 20. 有效的括号
题目描述:
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
思路:
通过栈解决。匹配到对称的括号,就出栈。
有左括号就入栈,遍历到对应的右括号就将其左括号出栈。
如果是有效括号,最后栈为空。
代码:
比较简单的写法:
public boolean isValid(String s) {
if (s==null) {
return false;
}
int n = s.length();
//括号是对称的。如果是奇数个,说明不符合
if (n%2 == 1) {
return false;
}
//通过 map 匹配。map的初始化,需要注意。key 为右括号。并且是字符,只需要单引号
//字符的泛型是 Character ,不要写错了
Map<Character, Character> map = new HashMap<>();
map.put(')','(');
map.put('}','{');
map.put(']','[');
Stack<Character> stack = new Stack<>();
for (int i=0;i< n; i++) {
char c = s.charAt(i);
//如果包含了右括号, 并且栈不为空,取出的数据等于对应的左括号,说明是一对匹配的括号,就 pop() 取出来
if (map.containsKey(c) && !stack.isEmpty() && stack.peek() == map.get(c)) {
stack.pop();
} else {
//否则 push进stack
stack.push(c);
}
}
//如果是对称括号,最后栈应该是空的.
return stack.isEmpty() ;
}
其他的写法:
public boolean isValid(String s) {
int n = s.length();
//括号是对称的。如果是奇数个,说明不符合
if (n%2 == 1) {
return false;
}
//通过 map 匹配。map的初始化,需要注意。key 为右括号。并且是字符,只需要单引号
//字符的泛型是 Character ,不要写错了
Map<Character,Character> map = new HashMap<>() {{
put( ')', '(');
put( ']', '[');
put( '}', '{');
}}
//栈,通过链表实现
//Deque(Double Ended Queue)是一个双端队列,它可以在两端插入和删除元素,并且可以充当栈或队列的角色。
Deque<Character> stack = new LinkedList<>();
for (int i=0; i<n; i++) {
char ch = s.charAt (i);
//如果包含了右括号
if (map.containsKey(ch)) {
//如果栈为空,或者取出的数据不为左括号,说明不是有效的括号
if (stack.isEmpty() || stack.peek()!= map.get(ch)) {
return false;
}
//一旦有对称括号,马上就取出
stack.pop();
} else {
//不是右括号就入栈
stack.push(ch);
}
}
//如果是对称括号,最后栈应该是空的.
return stack.isEmpty();
}
浙公网安备 33010602011771号