1/**2* @param {string} s3* @return {boolean}4*/5var checkValidString = function (s) {6let map = {};7return check(s, 0, 0, map);8};910function check(s, index, open, map) {11if (index == s.length) {12return open == 0;13}1415if (open < 0) {16return false;17}18let string = index.toString() + "##" + open.toString();19if (string in map) {20return map[string];21}2223if (s[index] == "(") {24let l = check(s, index + 1, open + 1, map);25map[string] = l;26return l;27} else if (s[index] == ")") {28let r = check(s, index + 1, open - 1, map);29map[string] = r;30return r;31} else {32let lr =33check(s, index + 1, open + 1, map) ||34check(s, index + 1, open - 1, map) ||35check(s, index + 1, open, map);36map[string] = lr;37return lr;38}39}