博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
10. Regular Expression Matching字符串.*匹配
阅读量:5131 次
发布时间:2019-06-13

本文共 2767 字,大约阅读时间需要 9 分钟。

[抄题]:

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: falseExplanation: "a" does not match the entire string "aa".

Example 2:

Input:s = "aa"p = "a*"Output: trueExplanation: '*' means zero or more of the precedeng element, 'a'. Therefore, by repeating 'a' once, it becomes "aa".

Example 3:

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

Example 4:

Input:s = "aab"p = "c*a*b"Output: trueExplanation: 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

 

转载于:https://www.cnblogs.com/immiao0319/p/8993634.html

你可能感兴趣的文章
jvm slot复用
查看>>
高并发系统数据库设计
查看>>
LibSVM for Python 使用
查看>>
入坑的开始~O(∩_∩)O~
查看>>
Centos 7.0 安装Mono 3.4 和 Jexus 5.6
查看>>
Windows 7 上安装Visual Studio 2015 失败解决方案
查看>>
iOS按钮长按
查看>>
Shell流程控制
查看>>
CSS属性值currentColor
查看>>
[Leetcode|SQL] Combine Two Tables
查看>>
《DSP using MATLAB》Problem 7.37
查看>>
ROS lesson 1
查看>>
js笔记
查看>>
c风格字符串函数
查看>>
python基础学习第二天
查看>>
java可重入锁reentrantlock
查看>>
浅谈卷积神经网络及matlab实现
查看>>
struts2学习(9)struts标签2(界面标签、其他标签)
查看>>
Android 导入jar包 so模块--导入放置的目录
查看>>
解决ajax请求cors跨域问题
查看>>