2021.11.25 每天进步一点点: 力扣题库20

题目介绍

在这里插入图片描述
在这里插入图片描述


思路解析(剥洋葱法)

本题用了两种方法解决。 当前介绍第一种: 剥洋葱法。

1, 很明确的是, 左右括号要成对存在。 所以,s.length必须是偶数。 如果是奇数,必定是无效的。

2,依据示例,我们很容易看出,必定有一种括号是紧挨着成对存在的。 比如() [] {}这种形式。

所以,我们就把这些括号一层一层的剥离掉。 直到无法剥离位置。

3,举个例子。 假定s = '{[()]}'

4,第一步,检查s中,有没有上述的紧挨着的成对的括号。 可以发现,例子中的s,有一对()是紧挨着的。 我们就把这对紧挨着的括号用''空字符替换(就是所谓的剥离)。

5,此时,s就变成了{[]}, 然后继续检查是否有紧挨着的成对的括号。所以,这一步可以把[]替换成空字符''

6,到这里,s就只剩下了{},按照上面的做法,继续剥离。

7,最后,s就变成了''。 此时可以发现,s中所有的括号都是成对存在的,最终被剥离成空字符串。所以,可以判定s是有效的。

否则,s就是无效的。


完整代码

/**
 * @param {string} s
 * @return {boolean}
 */
var isValid = function(s) {
    // 奇数个字符 必定无效
		if(s.length % 2 === 1) {
			return false;
		}

		// 替换函数递归
		var result = '';
		function replaceStr(str) {
			var str1 = str.replace(/\(\)/g, '').replace(/\[\]/g, '').replace(/\{\}/g, '');
			if(str1 === str) {
				result = str1;
			} else {
				replaceStr(str1);
			}
		}
		replaceStr(s);

		if(result.length === 0) {
			return true;
		} else {
			return false;
		}
};

提交结果

在这里插入图片描述


思路二(拼对法,也叫栈方法)

1,把括号按照右键左值的形式,保存起来。后续做对比时用。

比如

new Map([
        [')', '('],
        [']', '['],
        ['}', '{']
    ])

2,准备一个空数组, 用于保存遍历s的值。

3,对s进行遍历。如果遍历到左括号,就存放到数组里。如果遍历到的是右括号,且能够和存储的左括号拼成一对,就从数组里把对应的括号删掉。

4,一直遍历,存储,删除。如果括号都能拼成对,说明s有效。 否则无效。

该方法比剥洋葱法更快。


栈方法提交结果

在这里插入图片描述
可以看出,该思路可以节省至少四分之一的时间。

说明

其他编程语言和方法中,有快到只用2ms 甚至更短时间的。 非常厉害。 可以前往查看。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值