前言
一个小伙伴说希望成立一个刷题小组,本就着富强、民主、文明、和谐,倡导自由、平等、公正、法治,倡导爱国、敬业、诚信、友善,积极培育社会主义核心价值观,我答应他了。
因为也没有刷过题,比较菜。然后就看了下别人家的孩子怎么刷题的,这里附上链接。
朝花夕拾 - 2019 总结(附 283 道 LeetCode 题解)
题目描述:
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 每个右括号都有一个对应的相同类型的左括号。
示例
输入: s = "()"
输出: true
输入: s = "()[]{}"
输出: true
输入: s = "(]"
输出: false
/**
* @param {string} s
* @return {boolean}
* 思路1:映射 下一个对应的左括号输入返回对应类型右括号。隔位遍历
* 思路2:遍历取出偶数位字符串 反转是否等于剩余字符串。
* 思路3:隔位遍历与被隔位映射对应相等
* 以上思路都是错的,尼玛还有{[()]}这种情况 {[()]}[]() 这种情况。日你仙人耙耙
*/
// var isValid = function(s) {
// let arr = [['(',')'],['{','}'],['[',']']]
// let bracket = new Map(arr)
// let res = true;
// for(i=0;i<s.length;i+=2){
// if(bracket.get(s[i])!==s[i+1]){
// res = false;
// break
// }
// }
// return res
// };
// 接下来仔细读题吧,左括号必须有对应的右括号闭合,
// 左括号必须以正确的顺序闭合 (([(])))[]()
// 新思路1 先把()[]{}拿出去,就是符合条件的先消失,有点像是消消乐。
// 多次遍历,把符合最小消除条件的[](){}这种情况可以消除,{[()]}这种情况只要消除() ,剩下的{[]}的[]也能消除了。
// 那么
var isValid = function (s) {
let arr = [['(', ')'], ['{', '}'], ['[', ']']]
let bracket = new Map(arr)
//建立一个栈堆,初始化第一个
let stack = []
for (let i = 0; i < s.length; i++) {
// 先判断栈是否为空
if (stack.length) {
//不为空就比较
if (bracket.get(stack[stack.length-1]) == s[i]) {
stack.pop();
}else{
stack.push(s[i])
}
} else {
stack.push(s[i])
}
}
if (stack.length > 0) {
return false
} else {
return true
}
}
菜的一笔
看看大佬怎么写的
/**
* @param {string} s
* @return {boolean}
*/
var isValid = function(s) {
let len =s.length;
if(len % 2 !==0 ){
return false;
}
let length = len / 2;
for (let i = 0; i < length; i++) {
s = s.replace("()", "");
s = s.replace("{}", "");
s = s.replace("[]", "");
}
return s.length === 0;
};
解题思路:反正没看懂
var isValid = function(s) {
const n = s.length;
if (n % 2 === 1) {
return false;
}
const pairs = new Map([
[')', '('],
[']', '['],
['}', '{']
]);
const stk = [];
for (let ch of s){
if (pairs.has(ch)) {
if (!stk.length || stk[stk.length - 1] !== pairs.get(ch)) {
return false;
}
stk.pop();
}
else {
stk.push(ch);
}
};
return !stk.length;
};