LeetCode每日一题(44. Wildcard Matching)

Given an input string (s) and a pattern §, implement wildcard pattern matching with support for ‘?’ and ‘*’ where:

‘?’ Matches any single character.
‘*’ Matches any sequence of characters (including the empty sequence).
The matching should cover the entire input string (not partial).

Example 1:

Input: s = “aa”, p = “a”
Output: false

Explanation: “a” does not match the entire string “aa”.

Example 2:

Input: s = “aa”, p = “*”
Output: true

Explanation: ‘*’ matches any sequence.

Example 3:

Input: s = “cb”, p = “?a”
Output: false

Explanation: ‘?’ matches ‘c’, but the second letter is ‘a’, which does not match ‘b’.

Constraints:

  • 0 <= s.length, p.length <= 2000
  • s contains only lowercase English letters.
  • p contains only lowercase English letters, ‘?’ or ‘*’.

无非就是 pattern 的三种情况:
a-z: 严格匹配当前字符,然后匹配剩余 pattern
?: 跳过当前字符继续匹配剩余 pattern
*: 遍历后面的每一个字符作为起点匹配剩余的 pattern, 只要有一个可以成功则视为成功



use std::collections::HashMap;

impl Solution {
    fn is_all_stars(pattern: &Vec<char>, pi: usize) -> bool {
        for c in &pattern[pi..] {
            if c != &'*' {
                return false;
            }
        }
        true
    }
    fn match_pattern(
        chars: &Vec<char>,
        pattern: &Vec<char>,
        ci: usize,
        pi: usize,
        cache: &mut HashMap<(usize, usize), bool>,
    ) -> bool {
        if ci == chars.len() {
            if pi == pattern.len() || Solution::is_all_stars(pattern, pi) {
                return true;
            }
            return false;
        }
        if pi == pattern.len() {
            return false;
        }
        let c = chars[ci];
        let p = pattern[pi];
        match p {
            '?' => {
                let ans = if let Some(c) = cache.get(&(ci + 1, pi + 1)) {
                    *c
                } else {
                    Solution::match_pattern(chars, pattern, ci + 1, pi + 1, cache)
                };
                cache.insert((ci, pi), ans);
                return ans;
            }
            '*' => {
                if pi == pattern.len() - 1 {
                    return true;
                }
                for ni in ci..chars.len() {
                    let next = if let Some(c) = cache.get(&(ni, pi + 1)) {
                        *c
                    } else {
                        Solution::match_pattern(chars, pattern, ni, pi + 1, cache)
                    };
                    if next {
                        return true;
                    }
                }
                cache.insert((ci, pi), false);
                return false;
            }
            _ => {
                if c != p {
                    return false;
                }
                let next = if let Some(c) = cache.get(&(ci + 1, pi + 1)) {
                    *c
                } else {
                    Solution::match_pattern(chars, pattern, ci + 1, pi + 1, cache)
                };
                cache.insert((ci, pi), next);
                return next;
            }
        }
    }

    pub fn is_match(s: String, p: String) -> bool {
        let chars: Vec<char> = s.chars().collect();
        let pattern: Vec<char> = p.chars().collect();
        Solution::match_pattern(&chars, &pattern, 0, 0, &mut HashMap::new())
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值