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

    题目描述:

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

    '?' 可以匹配任何单个字符。
    '*' 可以匹配任意字符串(包括空字符串)。
    两个字符串完全匹配才算匹配成功。

    说明:

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

    示例 1:

    输入:
    s = "aa"
    p = "a"
    输出: false
    解释: "a" 无法匹配 "aa" 整个字符串。

    示例 2:

    输入:
    s = "aa"
    p = "*"
    输出: true
    解释: '*' 可以匹配任意字符串。

    示例 3:

    输入:
    s = "cb"
    p = "?a"
    输出: false
    解释: '?' 可以匹配 'c', 但第二个 'a' 无法匹配 'b'。

    思路分析:

    这道题一开始是的思路是用暴力逐个比对,利用递归完成,但这样需要判断的情况很多,实现起来比较复杂。

    题目的标签是动态规划,所以考虑用dp来解决。这里的状态应该是一个二维数组dp[][],其中dp[i][j]表示的是字符串s的前i个字符和模式p的前j个字符是否匹配。同样需要分情况去考虑dp转移方程。具体看代码。

    代码:

     1 class Solution {
     2 public:
     3     bool isMatch(string s, string p) {
     4         int m = s.size();
     5         int n = p.size();
     6         vector<vector<bool>> dp(m+1, vector<bool>(n+1));
     7         dp[0][0] = true;
     8         for(int i=0; i<=m; i++)
     9         {
    10             for(int j=1; j<=n; j++)
    11             {
    12                 if(i == 0)
    13                 {
    14                     if(p[j-1] == '*')
    15                     {
    16                         dp[0][j] = dp[0][j-1];
    17                         continue;
    18                     }
    19                 }
    20                 else
    21                 {
    22                     if(s[i-1] == p[j-1] || p[j-1] == '?')
    23                     {
    24                         dp[i][j] = dp[i-1][j-1];
    25                     }
    26                     else if(p[j-1] == '*')
    27                     {
    28                         dp[i][j] = dp[i-1][j] || dp[i][j-1];
    29                     }
    30                 }
    31             }
    32         }
    33         return dp[m][n];
    34     }
    35 
    36 };
  • 相关阅读:
    避免前置声明
    CLion在WSL上远程调试代码设置
    push_back与构造函数
    _BLOCK_TYPE_IS_VALID(pHead->nBlockUse问题解析
    Qt报错
    关于引用与指针实现多态的一些记录
    Vue-Axios异步通信
    Kafka概述
    学习Ajax看着一篇就够了
    学习Json看着一篇就够了
  • 原文地址:https://www.cnblogs.com/LJ-LJ/p/11220422.html
Copyright © 2011-2022 走看看