zoukankan      html  css  js  c++  java
  • 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

     [暴力解法]:

    时间分析:

    空间分析:

     [优化后]:

    时间分析:

    空间分析:

    [奇葩输出条件]:

    [奇葩corner case]:

    初始化dp[0][j]的时候,除开一直是*的情况,都不能随意匹配 

    [思维问题]:

    搞不清楚和第十题的区别:就是能不能遗传 dp[i][j] = dp[i][j - 2]就行了

    [英文数据结构或算法,为什么不用别的数据结构或算法]:

    [一句话思路]:

    [输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):

    [画图]:

    [一刷]:

    1. dp[i][j - 1] 是重复一个字符的情况(其中包括了空字符),所以空字符不需要单独列出来

    [二刷]:

    [三刷]:

    [四刷]:

    [五刷]:

      [五分钟肉眼debug的结果]:

    [总结]:

    1. dp[i][j - 1] 是重复一个字符的情况(其中包括了空字符),所以空字符不需要单独列出来

    [复杂度]:Time complexity: O(mn) Space complexity: O(mn)

    [算法思想:递归/分治/贪心]:贪心

    [关键模板化代码]:

    for (int i = 1; i <= m; i++) {
                dp[i][0] = false;
            }
            
            for (int j = 1; j <= n; j++) {
                if (p.charAt(j - 1) == '*') dp[0][j] = true;
                else break;
            }

    [其他解法]:

    [Follow Up]:

    [LC给出的题目变变变]:

    10有前序的

     [代码风格] :

     [是否头一次写此类driver funcion的代码] :

    class Solution {
        public boolean isMatch(String s, String p) {
            //ini: dp[][]
            int m = s.length();
            int n = p.length();
            boolean[][] dp = new boolean[m + 1][n + 1];
            
            //cc: dp[0][0], dp[0][], dp[][0]
            dp[0][0] = true;
            
            for (int i = 1; i <= m; i++) {
                dp[i][0] = false;
            }
            
            for (int j = 1; j <= n; j++) {
                if (p.charAt(j - 1) == '*') dp[0][j] = true;
                else break;
            }
            
            //for loop: not * must equal or ., * 0 or more
            for (int i = 1; i <= m; i++) {
                for (int j = 1; j <= n; j++) 
                    if (p.charAt(j - 1) != '*') {
                        //1s
                        dp[i][j] = dp[i - 1][j - 1] && (s.charAt(i - 1) == p.charAt(j - 1) || p.charAt(j - 1) == '?');
                    }else {
                        //multiple s, 0 s
                        dp[i][j] = dp[i - 1][j] || dp[i][j - 1];
                    }
            }
            
            //return m n
            return  dp[m][n];
        }
    }
    View Code
  • 相关阅读:
    基于springBoot使用templates技术
    springBoot将配置文件读取进对象
    Django学习笔记二十二——Django的简易项目之账户注册的实现
    Django学习笔记二十一——Django的auth模块
    Django学习笔记二十——Django请求流程梳理总结
    Django学习笔记一十八——Django中间件的使用
    Django学习笔记一十五——cookies和session
    Django学习笔记一十九——补充内容:视图中的CBV和FBV (2020-05-15 15:05)
    Django学习笔记一十八——Django的数据库可视化操作
    Django学习笔记一十七——Django的FORM表单
  • 原文地址:https://www.cnblogs.com/immiao0319/p/9081346.html
Copyright © 2011-2022 走看看