zoukankan      html  css  js  c++  java
  • 44. LeetCode 通配符匹配

    44. 通配符匹配

    题目链接

    题目描述

    给定一个字符串 (s) 和一个字符模式 (p) ,实现一个支持 '?''*' 的通配符匹配。

    '?' 可以匹配任何单个字符。
    '*' 可以匹配任意字符串(包括空字符串)。
    

    两个字符串完全匹配才算匹配成功。

    说明:

    s 可能为空,且只包含从 a-z 的小写字母。
    p 可能为空,且只包含从 a-z 的小写字母,以及字符 ? 和 *。
    

    1. 状态转移方程

    f[i][j] 表示 s 的前 i 个和 p 的前 j 个 是否可以匹配 。

    2. 边界情况

    当(i)的值为0,且p的前j个字符均为*时均可匹配,即:

    for (int i = 1; i < m; i++) {
        if (p[i] == '*') f[0][i] = true;
        else break;
    }
    

    3. 状态转移

    1. 如果 p[j] != '*'p[i][j] = p[i-1][j-1] && (s[i] == p[j] || p[j] == '?')
    2. 如果 p[j] == '*' 则 :
      • p[i][j] = p[i][j-1] 表示第 j 位的 * 匹配的位空字符串
      • p[i][j] = p[i-1][j] 表示第 j 位的 * 匹配的任意字符串

    4. 完整代码

    bool isMatch(string s, string p) {
        s = " " + s, p = " " + p;
        int n = s.size(), m = p.size();
    
        vector<vector<bool>> f(n+1, vector<bool> (m+1, false));
    
        for (int i = 1; i < m; i++) {
            if (p[i] == '*') {
                f[0][i] = true;
            } else {
                break;
            }
        }
    
        f[0][0] = true;
        for (int i = 1; i < n; i++) {
            for (int j = 1; j < m; j++) {
                if (p[j] != '*') {
                    f[i][j] = f[i-1][j-1] && (s[i] == p[j] || p[j] == '?');
                } else {
                    f[i][j] = f[i-1][j] || f[i][j-1];
                  return f[n-1][m-1];
    }
    
  • 相关阅读:
    python-高阶函数(map,reduce,filter)
    python-函数(补充)
    python-局部变量与全局变量
    python-函数
    字符串格式化
    pycharm2019.1激活方法(亲测可用)
    python-集合
    python-字典
    keepalivd 配置
    zabbix3 agent端安装
  • 原文地址:https://www.cnblogs.com/mayapony/p/13258829.html
Copyright © 2011-2022 走看看