声明:只求用最简单的方法通过,不求优化,不喜勿喷
- 贪心解决,两次遍历
- 如果一个字符串从左往右遍历,在没有 ( 的情况下,如果出现 ) 那么这个字符串不符合要求,所以我们假设所有的 * 转化为 ( ,如果还有 ) 不满足匹配条件,那么它肯定不符合要求,所以用一个cnt记录,出现的 ( 和 * ,则数量-1;如果出现 ) 则数量+1,如果出现遍历到 )但是当前数量小于0的情况,说明最极端情况下不能符合,返回false
- 同理,用逆向思维思考从右往左遍历
- 如果从左往右和从右往左遍历都满足要求的化,那么这个字符串满足要求
/**
* @param {string} s
* @return {boolean}
*/
var checkValidString = function (s) {
let cnt = 0;
for (var i = 0; i < s.length; i++) {
if (s[i] == '(' || s[i] == '*') {
cnt--;
} else if (s[i] == ')') {
if (cnt >= 0) {
return false
}
cnt++;
}
}
cnt = 0;
for (var i = s.length-1; i >= 0 ; i--) {
if (s[i] == ')' || s[i] == '*') {
cnt--;
} else if (s[i] == '(') {
if (cnt >= 0) {
return false
}
cnt++;
}
}
return true
};