zoukankan      html  css  js  c++  java
  • 10. Regular Expression Matching字符串.*匹配

    [抄题]:

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

    '.' Matches any single character.
    '*' Matches zero or more of the preceding element.
    

    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 = "a*"
    Output: true
    Explanation: '*' means zero or more of the precedeng element, 'a'. Therefore, by repeating 'a' once, it becomes "aa".
    

    Example 3:

    Input:
    s = "ab"
    p = ".*"
    Output: true
    Explanation: ".*" means "zero or more (*) of any character (.)".
    

    Example 4:

    Input:
    s = "aab"
    p = "c*a*b"
    Output: true
    Explanation: c can be repeated 0 times, a can be repeated 1 time. Therefore it matches "aab".
    

    Example 5:

    Input:
    s = "mississippi"
    p = "mis*is*p*."
    Output: false

     [暴力解法]:

    时间分析:

    空间分析:

     [优化后]:

    时间分析:

    空间分析:

    [奇葩输出条件]:

    [奇葩corner case]:

    [思维问题]:

    想不到是dp:最值、可行、个数

    [一句话思路]:

    写不出程序,就尝试只写公式

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

    [画图]:

    [一刷]:

    1. 先写一般情况,再写特殊情况,别丢了

    [二刷]:

    1. 都是从1<x <=n开始写,请看新代码

    [三刷]:

    [四刷]:

    [五刷]:

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

    [总结]:

    前面的不能用,后果会遗传,是这道题和wildcard匹配的区别 dp[i][j] = dp[i][j - 2];

    [复杂度]:Time complexity: O(n^2) Space complexity: O(n^2)

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

    [关键模板化代码]:

    [其他解法]:

    [Follow Up]:

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

     [代码风格] :

    class Solution {
        public boolean isMatch(String s, String p) {
            //ini:dp[][], dp[0][0], dp[0][j]
            boolean[][] dp = new boolean[s.length() + 1][p.length() + 1];
            dp[0][0] = true;
            for (int j = 1; j <= p.length(); j++) {
                if (p.charAt(j - 1) == '*' && dp[0][j - 2] == true) dp[0][j] = true;
            }
            
            //for loop: 2 cases
            for (int i = 1; i <= s.length(); i++) {
                for (int j = 1; j <= p.length(); j++) {
                    if (p.charAt(j - 1) == s.charAt(i - 1) ) {
                        dp[i][j] = dp[i - 1][j - 1];
                    }
                    
                    if (p.charAt(j - 1) == '.') {
                        dp[i][j] = dp[i - 1][j - 1];
                    }
                    
                    
                    if (p.charAt(j - 1) == '*') {
                        //*之前的不能用
                        if (p.charAt(j - 2) != s.charAt(i - 1) && p.charAt(j - 2) != '.') {
                            //前面的不能用,后果会遗传
                        dp[i][j] = dp[i][j - 2];
                    }else {
                        //匹配多个,0个,1个
                        dp[i][j] = dp[i - 1][j] || dp[i][j - 2] || dp[i][j - 1];
                    }
                    }
    
                }
            }
            
            //return 
            return dp[s.length()][p.length()];
        }
    }
    View Code
  • 相关阅读:
    分布式服务之CAP定理
    VUE启动报错
    码云管理项目
    推广项目之日志打印
    asp.net mvc中使用jquery H5省市县三级地区选择控件
    asp.net mvc+jquery easyui开发实战教程之网站后台管理系统开发4- 后台模板html页面创建
    asp.net mvc+jquery easyui开发实战教程之网站后台管理系统开发2-Model层建立
    asp.net mvc+jquery easyui开发实战教程之网站后台管理系统开发3-登录模块开发
    asp.net mvc+jquery easyui开发实战教程之网站后台管理系统开发1-准备工作
    asp.net mvc下实现微信公众号(JsApi)支付介绍
  • 原文地址:https://www.cnblogs.com/immiao0319/p/8993634.html
Copyright © 2011-2022 走看看