题目介绍
思路解析(剥洋葱法)
本题用了两种方法解决。 当前介绍第一种: 剥洋葱法。
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 甚至更短时间的。 非常厉害。 可以前往查看。