持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第7天,点击查看活动详情
20.有效的括号
题目分析
题目要求判断一个字符串是否有效,有效字符需要左括号与同类型右括号闭合,并且是以正确顺序闭合。由于栈先入后出的特性,使它非常适合解决对称匹配类题目。
解决题目
首先需要列举不满足有效字符串的情况:
- 左括号多余
- 右括号多余
- 括号不匹配
这道题的解决很简单,首先遍历字符串,如果遇到足够好,那么就将它对应的右括号存入栈中,当遇到右括号时,如果栈中有相同的括号则弹出。
接下来根据上面不有效的情况,来判断三种情况:
- 已经遍历完字符串,但是栈不为空,说明左括号多余
- 字符串匹配的过程中,栈已经为空,说明右括号多余
- 最后一种是遍历字符串的过程中发现栈里面没有匹配的字符
接下来就可以编码了,代码如下:
var isValid = function(s) {
let stack = []
let map = {"(":")","{":"}","[":"]"}
for(let x of s) {
if(x in map) {
stack.push(x)
continue
}
if(map[stack.pop()] !== x) return false
}
return !stack.length
};
1047. 删除字符串中的所有相邻重复项
分析题目
题目要求重复删除小写字符串中两个相邻且相同的字母,这道题需要注意的是删除后仍可能继续重复。
解决
这样这道题就需要在遍历字符串的同时,比较遍历的元素与前一个元素是否相同,需要一个结构来存储前面一个元素。这个问题用栈来解决就非常简单。
首先遍历元素将元素入栈,如果栈顶元素与将要入栈的元素相同,那么pop出栈顶元素,并且将要入栈的元素并不入栈。直到遍历结束,将栈中元素逐个pop出,并反转就能得到结果。
代码如下:
var removeDuplicates = function(s) {
const stack = [];
for(const x of s) {
let c = null;
if(stack.length && x === (c = stack.pop())) continue;
c && stack.push(c);
stack.push(x);
}
return stack.join("");
};
总结
栈与队列的问题并不困难,但需要对栈与队列深入理解。