题目:
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
解析:
class Solution {
public boolean isValid(String s) {
int n = s.length();
if(n % 2 == 1){
return false; //判断字符串长度是否为偶数
}
Map<Character,Character> pairs = new HashMap<Character,Character>(){{ //用HashMap将左括号进行匹配
put(')', '(');
put(']', '[');
put('}', '{');
}};
Deque<Character> stack = new LinkedList<Character>(); //用栈数据结构进行判断
for (int i = 0; i < n; i++) {
char ch = s.charAt(i); //遍历字符串中的字符
if (pairs.containsKey(ch)) { //如果匹配则说明是右括号
if (stack.isEmpty() || stack.peek() != pairs.get(ch)) { //如果栈是空的或者栈空间没有所对应的左括号,说明括号的顺序不对
return false;
}
stack.pop();//将栈空间栈顶移出进行匹配
} else {
stack.push(ch); //说明是左括号需要入栈
}
}
return stack.isEmpty();//如果栈为空,说明全部匹配成功
}
}