selected_coding_interview/docs/20. 有效的括号.md
stack 仍然为空;dic 构建左右括号对应关系:$key$ 左括号,$value$ 右括号;这样查询 $2$ 个括号是否对应只需 $O(1)$ 时间复杂度;建立栈 stack,遍历字符串 s 并按照算法流程一一判断。c 是左括号,则入栈 $push$;stack 栈顶出栈括号 stack.pop() 与当前遍历括号 c 不对应,则提前返回 $false$。stack 为空: 此时 stack.pop() 操作会报错;因此,我们采用一个取巧方法,给 stack 赋初值 $?$ ,并在哈希表 dic 中建立 $key: '?',value:'?'$ 的对应关系予以配合。此时当 stack 为空且 c 为右括号时,可以正常提前返回 $false$;s 以左括号结尾: 此情况下可以正常遍历完整个 s,但 stack 中遗留未出栈的左括号;因此,最后需返回 len(stack) == 1,以判断是否是有效的括号组合。s;<,,,,,>
class Solution:
def isValid(self, s: str) -> bool:
dic = {'{': '}', '[': ']', '(': ')', '?': '?'}
stack = ['?']
for c in s:
if c in dic: stack.append(c)
elif dic[stack.pop()] != c: return False
return len(stack) == 1
class Solution {
private static final Map<Character,Character> map = new HashMap<Character,Character>(){{
put('{','}'); put('[',']'); put('(',')'); put('?','?');
}};
public boolean isValid(String s) {
if(s.length() > 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;
}
}