• leetcode 44. Wildcard Matching


    Given an input string (s) and a pattern (p), implement wildcard pattern matching with support for '?' and '*'.

    '?' Matches any single character.
    '*' Matches any sequence of characters (including the empty sequence).
    

    The matching should cover the entire input string (not partial).

    Note:

    • s could be empty and contains only lowercase letters a-z.
    • p could be empty and contains only lowercase letters a-z, and characters like ? or *.

    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'.
    

    Example 4:

    Input:
    s = "adceb"
    p = "*a*b"
    Output: true
    Explanation: The first '*' matches the empty sequence, while the second '*' matches the substring "dce".
    

    Example 5:

    Input:
    s = "acdcb"
    p = "a*c?b"
    Output: false

    思路:基本和leetcode10 正则表达式匹配思路一致。

    方法一:记忆化搜索

     1 class Solution {
     2 public:
     3     bool isMatch(string s, string p) {
     4         int lens = s.length(), lenp = p.length();
     5         vector<vector<int> > memo(lens + 1, vector<int>(lenp + 1, -1));
     6         return isMatch(s, p, 0, 0, memo);
     7     }
     8     bool isMatch(string s, string p, int i, int j, vector<vector<int> > &memo) {
     9         if (memo[i][j] != -1) {
    10             return memo[i][j];
    11         }
    12         int ans;
    13         if (j >= p.length()) {
    14             ans = (i == s.length());
    15         } else {
    16             bool first_match = (i < s.length() && (s[i] == p[j] || p[j] == '?' || p[j] == '*'));
    17             if (p[j] == '*') {
    18                 ans = isMatch(s, p, i, j + 1, memo) || (first_match && isMatch(s, p, i + 1, j, memo));
    19             } else {
    20                 ans = first_match && isMatch(s, p, i + 1, j + 1, memo);
    21             }
    22         }
    23         memo[i][j] = ans;
    24         return ans;
    25     }
    26 };

    方法二:动态规划

     1 class Solution {
     2 public:
     3     bool isMatch(string s, string p) {
     4         int lens = s.length(), lenp = p.length();
     5         bool dp[lens + 1][lenp + 1];
     6         memset(dp, false, sizeof(dp));
     7         //vector<vector<bool> > dp(lens + 1, vector<bool>(lenp + 1, false)); //用vector耗时
     8         dp[0][0] = true;
     9         for(int i = 1; i <= lenp; i ++) {
    10             dp[0][i] = p[i - 1] == '*' && dp[0][i - 1];
    11         }
    12         for(int i = 1; i <= lens; i ++) {
    13             for(int j = 1; j <= lenp; j ++) {
    14                 if(p[j - 1] != '*') {
    15                     if ((s[i - 1] == p[j - 1]) || (p[j - 1] == '?')) {
    16                         dp[i][j] = dp[i - 1][j - 1];
    17                     }
    18                 } else {
    19                     dp[i][j] = (dp[i][j - 1] || dp[i - 1][j]); //如果长度为j的p,最后一个是'*',可以将'*'变成s的最后一个字符,则有dp[i][j] = dp[i - 1][j], 或者'*'变为空。dp[i][j] = dp[i][j - 1]
    20                 }
    21             }
    22         }
    23         return dp[lens][lenp];
    24     }
    25 };
  • 相关阅读:
    apscheduler 踩坑
    fastapi 导出excel文件
    python flask 使用日志
    git 头指针游离问题
    C# 连接mysql填坑
    前端项目proxy小问题
    需完善--日志框架
    依赖<dependency>的scope了解
    git 退回到指定tag版本
    git切换远程仓库地址
  • 原文地址:https://www.cnblogs.com/qinduanyinghua/p/11528190.html
Copyright © 2020-2023  润新知