leetcode678.有效的括号字符串 | 刷题打卡

141 阅读2分钟

题目描述

leetcode链接:leetcode-cn.com/problems/va…

给定一个只包含三种字符的字符串: , 和 *,写一个函数来检验这个字符串是否为有效字符串。有效字符串具有如下规则:

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

示例1:

输入: "()"
输出: True

实例2:

输入: "(*)"
输出: True

提示:

  • 字符串大小将在 [1,100] 范围内。

思路描述

  1. 先将字符串转换成数组,初始化 left 和 star 数组
  2. 遍历数组,如果是 ( ,则将索引 push 到 left 数组中,如果是 * ,则将索引 push 到 star 数组中,如果是 ) ,则判断 left 数组是否为空,不为空的话则移除最后一位,如果为空的话则判断 star 数组是否为空,不为空的话则移除最后一位,都为空的话则说明没有能与 ) 配对的值,则返回 false 。
  3. 遍历完后,比较 left 与 star 数组的长度,star 数组长度肯定大于等于 left 数组长度才能形成有效的括号字符串,否则返回 false。
  4. 进行 while 循环,比较 left 的最后一位和 star 的最后一位的索引值,如果 star 的索引值大于 left ,说明是 *( ,不能形成有效的括号,返回 false 。知道 left.length === 0 为止。

AC代码

/**
 * @param {string} s
 * @return {boolean}
 */
var checkValidString = function(s) {
    const arr = s.split("");
    const len = arr.length;
    const left = [];
    const star = [];
    for (let i = 0; i < len; i++) {
        const item = arr[i];
        if (item === "(") {
            left.push(i);
        } else if (item === "*") {
            star.push(i)
        } else {
            if (left.length) {
                left.pop();
            } else if (star.length) {
                star.pop();
            } else {
                return false;
            }
        }
    }
    if (left.length > star.length) {
        return false;
    }
    while(left.length) {
        const i = left.length - 1;
        const j = star.length - 1
        if (left[i] > star[j]) {
            return false;
        }
        left.pop();
        star.pop();
    }
    return true;
};

image.png

总结

这道题只要想明白了其实挺简单的,一步步认真分析就可以得到结果。

本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情