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
  • 相关阅读:
    【转】Yii的url美化管理
    【转】通过文件锁实现,程序开始运行时,先判断文件是否存在,若存在则表明该程序已经在运行了,如果不存在就用open函数创建该文件,程序退出时关闭文件并删除文件
    【转】关于C execlp函数的理解
    【转】shell循环,判断介绍,以及实例
    【转】Yii framework config 可以被配置的项目
    高级着色语言HLSL入门(7)
    c++中的string用法
    关于链表的创建 代码
    c++笔试题汇总
    TCP Socket编程 C/C++实现 (Windows Platform SDK)
  • 原文地址:https://www.cnblogs.com/immiao0319/p/8993634.html
Copyright © 2011-2022 走看看