LeetCode刷题日记(简单)- 20. 有效的括号

137 阅读1分钟

前言

一个小伙伴说希望成立一个刷题小组,本就着富强、民主、文明、和谐,倡导自由、平等、公正、法治,倡导爱国、敬业、诚信、友善,积极培育社会主义核心价值观,我答应他了。

因为也没有刷过题,比较菜。然后就看了下别人家的孩子怎么刷题的,这里附上链接。

-力扣传送门-

朝花夕拾 - 2019 总结(附 283 道 LeetCode 题解)

我是如何刷 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
    }
}

image.png

菜的一笔

看看大佬怎么写的

/**
 * @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;
};