题目分析:
这道题与有效的括号类似,只不过要多考虑几种情况,先用HashMap存入两种对应的情况,直接遍历s,遇到'ab'、'a'入栈,遇到'c'、'bc'出栈,如果栈顶为'a',当前遍历到的字符为'b',直接将'b': 'c'存入哈希表,以应对'a...b...c'这种情况,最后判断栈是否为空即可。
源代码:
function isValid(s) {
const matchMap = new Map([['a', 'bc'], ['ab', 'c']]);
const stack = new Array();
for(let i = 0; i < s.length; i++) {
// 遇到哈希表中对应的情况直接入栈
if(s.substring(i, i + 2) === 'ab') {
stack.push('ab');
i++;
continue;
}
// 入栈
if(s.charAt(i) === 'a') {
stack.push('a');
continue;
}
// 当前字符在哈希表中有对应,直接出栈
if(s.substring(i, i + 2) === matchMap.get(stack[stack.length - 1])) {
stack.pop();
i++;
continue;
}
// 应对'a...b...c'的情况,当栈顶为'a',并且当前遇到的是'b'字符,就将'b': 'c'存入哈希表中
if(stack[stack.length - 1] === 'a' && s.charAt(i) === 'b') {
stack.pop();
stack.push('b');
matchMap.set('b', 'c');
continue;
}
// 出栈
if(s.charAt(i) === matchMap.get(stack[stack.length - 1])) {
stack.pop();
continue;
}
stack.push(s.charAt(i));
}
// 最后判断栈是否为空,为空则有效
return stack.length === 0;
};