Skip to content

No.678 有效的括号字符串

给你一个只包含三种字符的字符串,支持的字符类型分别是 '('、')' 和 '*'。请你检验这个字符串是否为有效字符串,如果是有效字符串返回 true 。

有效字符串符合如下规则:

  • 任何左括号 '(' 必须有相应的右括号 ')'。
  • 任何右括号 ')' 必须有相应的左括号 '(' 。
  • 左括号 '(' 必须在对应的右括号之前 ')'。
  • '*' 可以被视为单个右括号 ')' ,或单个左括号 '(' ,或一个空字符串。
  • 一个空字符串也被视为有效字符串。

示例 1:

text
输入:s = "()"
输出:true

示例 2:

text
输入:s = "(*)"
输出:true

示例 3:

text
输入:s = "(*))"
输出:true

提示:

  • 1 <= s.length <= 100
  • s[i] 为 '('、')' 或 '*'

解题思路

实现

双栈

js
/**
 * @param {string} s
 * @return {boolean}
 */
var checkValidString = function (s) {
  let leftStack = [];
  let starStack = [];
  for (let i = 0; i < s.length; i++) {
    if (s[i] === "(") {
      leftStack.push(i);
    } else if (s[i] === "*") {
      starStack.push(i);
    } else {
      if (leftStack.length) {
        leftStack.pop();
      } else if (starStack.length) {
        starStack.pop();
      } else {
        return false;
      }
    }
  }
  while (leftStack.length && starStack.length) {
    if (leftStack.pop() > starStack.pop()) {
      return false;
    }
  }
  return !leftStack.length;
};

贪心

js
/**
 * @param {string} s
 * @return {boolean}
 */
var checkValidString = function (s) {};

动态规划

js
/**
 * @param {string} s
 * @return {boolean}
 */
var checkValidString = function (s) {};