有效的括号字符串

有效的括号字符串

CategoryDifficultyLikesDislikes
algorithmsMedium (39.23%)553-

Tags

string

Companies

Unknown

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

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

示例 1:

1
2
输入: "()"
输出: True

示例 2:

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

示例 3:

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

注意:

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

Discussion | Solution

解法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
struct Solution;
// @lc code=start
impl Solution {
    /// ## 解题思路
    /// - 贪心法
    pub fn check_valid_string(s: String) -> bool {
        let mut unpaired_lefts = 0; //未匹配的'('数
        let mut can_pair_rights = 0; //可匹配')'的容量
        for c in s.chars() {
            match c {
                '(' => {
                    can_pair_rights += 1;  // 可匹配')'的容量+1
                    unpaired_lefts += 1;   // 未匹配的'('总数+1 
                }
                ')' => {
                    // 如果没有匹配')'的容量
                    if can_pair_rights <= 0 {
                        return false;
                    }
                    can_pair_rights -= 1;
                    // 如果存在未匹配的'('
                    if unpaired_lefts > 0 {
                        unpaired_lefts -= 1;    //未匹配的'('数量-1
                    }
                }
                '*' => {
                    can_pair_rights += 1;        // 可匹配')'的容量+1
                    // 如果有未匹配的'('
                    if unpaired_lefts > 0 {
                        unpaired_lefts -= 1;    // 未匹配的'('数-1
                    };
                    
                }
                _ => {}
            }
        }
        unpaired_lefts == 0
    }
}
// @lc code=end

#[cfg(test)]
mod tests {
    use super::*;
    #[test]
    fn test() {
        assert_eq!(Solution::check_valid_string("()".into()), true);
        assert_eq!(Solution::check_valid_string("(*)".into()), true);
        assert_eq!(Solution::check_valid_string("())".into()), false);
        assert_eq!(Solution::check_valid_string("*)".into()), true);
        assert_eq!(Solution::check_valid_string("(*".into()), true);
        assert_eq!(Solution::check_valid_string("(*))".into()), true);
    }
}
updatedupdated2024-08-252024-08-25