• 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];
    }
    
  • 相关阅读:
    iOS设计模式之一:MVC模式和单例模式
    高清图标搜索引擎
    中国地址英文书写格式(转载)
    iOS设置状态栏样式,statusBarStyle
    关于iOS启动页launchImage和各个屏幕使用的分辨率
    使用终端命令行将本地项目上传到Github
    iOS项目梳理-第一天- 项目框架搭建
    静态库合成
    iOS中的通知
    iOS UserSize Classes
  • 原文地址:https://www.cnblogs.com/mayapony/p/13258829.html
Copyright © 2020-2023  润新知