LC20. 有效的括号

我的思路:

将字符串转为数组,取到每个括号的个数,以及最大的索引值。

找到所有false的可能情况,将左右括号分类,进行两个判断:

1)若左括号和右括号不相等,则false

2)若最右边的左括号大于最右边的右括号,则返回false

3)剩余的返回true

//leetcode 20. 有效的括号
/**
 * @param {string} s
 * @return {boolean}
 */
var isValid = function (s) {
    //思路:分类,排除法
    //对于小括号,如果左括号个数不等于右括号,false
    //如果相等,则判断索引值大小,只有右括号索引值最大的情况下为false
    //最后对于中括号,大括号采取相同的办法
    var LeftSmallNum = 0;
    var RightSmallNum = 0;
    var LeftSmallIndex = 0;
    var RightSmallIndex = 0;
    var LeftMediumNum = 0;
    var RightMediumNum = 0;
    var LeftMediumIndex = 0;
    var RightMediumIndex = 0;
    var LeftLargeNum = 0;
    var RightLargeNum = 0;
    var LeftLargeIndex = 0;
    var RightLargeIndex = 0;
    var arr = [];
    //step1:字符串转为数组
    s.split('').forEach(e => {
        arr.push(e)
    })
    //step2:循环数组
    arr.forEach(function (item, index, array) {
        // item数组中的当前项, index当前项的索引, array原始数组;
        if (item == "(") {
            LeftSmallNum++;
            LeftSmallIndex = index;
        }
        if (item == ")") {
            RightSmallNum++;
            RightSmallIndex = index;
        }
        if (item == "[") {
            LeftMediumNum++;
            LeftMediumIndex = index;
        }
        if (item == "]") {
            RightMediumNum++;
            RightMediumIndex = index;
        } if (item == "{") {
            LeftLargeNum++;
            LeftLargeIndex = index;
        }
        if (item == "}") {
            RightLargeNum++;
            RightLargeIndex = index;
        }

    })


    if (LeftSmallNum !== RightSmallNum) {
        return false
    } else if (LeftMediumNum !== RightMediumNum) {
        return false
    } else if (LeftLargeNum !== RightLargeNum) {
        return false
    } else if (LeftSmallIndex > RightSmallIndex) {
        return false;
    } else if (LeftMediumIndex > RightMediumIndex) {
        return false;
    } else if (LeftLargeIndex > RightLargeIndex) {
        return false;
    } else {
        return true
    }

};

isValid("((()))[]")

结果很接近,但是不够全面。

这是由于以上思维将大小中括号分开判断,他们组合起来也会产生false,如下:

 思维肯定出问题了,所以找到大佬答案:

先进行判断字符串长度是否为偶数 如果不是则直接 returan false;
是偶数,因为每个括号都是两个字符组成,所以遍历长度为 let length = len / 2;
每次遍历找到对应的括号将它替换成""。

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

作者:mr-wang-y-p
链接:https://leetcode.cn/problems/valid-parentheses/solution/by-mr-wang-y-p-uz6a/
来源:力扣(LeetCode)

答案2:

根据题意,我们可以推断出以下要点:

有效括号字符串的长度,一定是偶数!
右括号前面,必须是相对应的左括号,才能抵消!
右括号前面,不是对应的左括号,那么该字符串,一定不是有效的括号!

// 解法一
let isValid = function(s) {
    let stack = [], length = s.length;
    if(length % 2) return false;
    for(let item of s){
        switch(item){
            case "{":
            case "[":
            case "(":
                stack.push(item);
                break;
            case "}":
                if(stack.pop() !== "{") return false;
                break;
            case "]":
                if(stack.pop() !== "[") return false;
                break;
            case ")":
                if(stack.pop() !== "(") return false;
                break;
        }
    }
    return !stack.length;
};

// 解法二
var isValid = function(s) {
    s = s.split('');
    let sl = s.length;
    if (sl % 2) return false;
    let map = new Map([[')', '('], [']', '['], ['}', '{']]);
    let stack = [];
    for(let i of s){
        if (map.get(i)) {
            if (stack[stack.length - 1] !== map.get(i)) return false;
            else stack.pop();
        } else {
            stack.push(i);
        }
    }
    return !stack.length;
};

作者:demigodliu
链接:https://leetcode.cn/problems/valid-parentheses/solution/guan-fang-tui-jian-ti-jie-you-xiao-de-gu-zyzg/
来源:力扣(LeetCode)
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值