题目:给定字符串s和模式串p(正则字符串),p中含有‘.’和‘*’为特定字符,需要使用匹配整个字符串s。

  1. ‘.’匹配任意单个字符
  2. ‘’匹配零个或多个前面的元素,即“c*”可以匹配任意多个‘c‘,‘.*’可以匹配任意多个字符

样例输入:s="mississippi", p="mis*is*p*.",return:false;

思路:若字符串s的长度为m,模式串p长度为n,则题目解应为模式串的前n个字符是否可以成功匹配字符串的前m个字符,这样题目即可以继续抽象为更小的子问题,字符串s的前m'个字符是否可以使用模式串p的前n'个字符成功匹配(0<m'≤m,0<n'≤n),这样可以使用动态规划来解决这个问题,使用01背包模板,对子字符串 s[0 : m']逐字符考察模式串 p[0 : n']是否可以成功匹配。

转移方程如下:

  1. 时,或 p[ n' ] = '.' 时,表示子串 s[0 : m']使用模式子串 p[0 : n'] 时匹配的结果会与子串 s[0 : m' - 1] 使用模式子串 p[0 : n' - 1] 匹配时状态相同;
  2. 时,表示可以使用模式串的上一位字符 p[n' - 1] ,若
    时,可以使用上一位匹配的结果对当前位置的状态进行更新,若仅匹配上了一位字符,即子串 s[0 : m'] 可以使用模式子串 p[0 : n' - 1]成功匹配,状态转移方程为
    (这里 '*' 并没有起到作用,但是该状态可以作为中间状态用于‘*’匹配到了多个相同字符时的更新);若已经使用‘*’匹配到了多个字符串并且还可以使用该字符串继续进行匹配时,即使用模式子串 p[0 : n'] 对子串s[0 : m'] 进行匹配后的状态与使用模式子串 p[0 : n'] 对 s[0 : m' - 1]进行匹配的状态相同,转移方程为
    ;若不使用任何一个‘*’对子串 s[0 : m'] 进行匹配时需要保证正确的状态,状态为
    (eg. 如果去掉这个转移方程,若s = "asdfa",p = "asdf.*a",dp矩阵第四行中只有 dp[4][4]为true,dp[4][6]为false;第五行中‘.’匹配‘a’成功dp[5][5]为true,dp[5][6]通过dp[5][5]得到true状态,但dp[5][7]只能从dp[4][6]请求状态,只能得到false,故错误,正确情况dp[4][6]应考虑不使用‘*’进行匹配,可以为true);
  3. 但子串上一位并没有成功匹配的情况下,如2情况最后一种小情况考虑,直接继承前两位的状态即可。

代码如下:

public class RegularExpressionMatching {public boolean isMatch(String s, String p) {boolean[][] dp = new boolean[s.length() + 1][p.length() + 1];dp[0][0] = true;for (int i = 0; i < p.length(); i++) {if (p.charAt(i) == '*')dp[0][i + 1] = dp[0][i - 1];}for (int i = 0; i < s.length(); i++) {for (int j = 0; j < p.length(); j++) {if (p.charAt(j) == s.charAt(i) || p.charAt(j) == '.')dp[i + 1][j + 1] = dp[i][j];else if (p.charAt(j) == '*' &&(p.charAt(j - 1) == '.' || s.charAt(i) == p.charAt(j - 1))) {dp[i + 1][j + 1] = dp[i + 1][j] || dp[i][j + 1] || dp[i + 1][j - 1];} else if (p.charAt(j) == '*') {dp[i + 1][j + 1] = dp[i + 1][j - 1];}}}return dp[s.length()][p.length()];}
}

其中初始化第0行的意思是使用模式串对空串进行匹配时的状态。


github:

https://github.com/AbelSara/LeetcodeNote​github.com

欢迎交流。

workbench字符匹配错误_猪憨憨刷题笔记-LeetCode-10 正则表达式匹配相关推荐

  1. 《剑指 Offer I》刷题笔记 1 ~10 题

    <剑指 Offer I>刷题笔记 1 ~10 题 栈与队列(简单) 1. 用两个栈实现队列 _解法 1:暴力做法 解法 2:优化解法 1 2. 包含 min 函数的栈 _解法 1:pop( ...

  2. [动态规划] leetcode 10 正则表达式匹配

    [动态规划] leetcode 10 正则表达式匹配 1.题目 题目链接 给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配. '.' 匹配任意单个字符 ...

  3. Java实现 LeetCode 10 正则表达式匹配

    10. 正则表达式匹配 给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配. '.' 匹配任意单个字符 '*' 匹配零个或多个前面的那一个元素 所谓匹配, ...

  4. LeetCode 10. 正则表达式匹配(递归/DP)

    文章目录 1. 题目 2. 解题 2.1 递归 2.2 DP 1. 题目 给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配. '.' 匹配任意单个字符 ...

  5. leetcode 10 --- 正则表达式匹配

    1 题目 给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配. '.' 匹配任意单个字符 '*' 匹配零个或多个前面的那一个元素 所谓匹配,是要涵盖 整个 ...

  6. LeetCode 10.正则表达式匹配(动态规划)

    题目描述 给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '' 的正则表达式匹配. '.' 匹配任意单个字符 '' 匹配零个或多个前面的那一个元素 所谓匹配,是要涵盖 整个 字 ...

  7. python刷题笔记怎么改_python面试题刷题笔记1 - 10

    函数参数传递:对象分为多变的对象和不变的对象.在python中,字符串.元组数字是不变的对象.列表,dict类型.设置等改变的对象.当引用传递给一个函数,函数的一个副本参考自动复制.这个函数的引用无关 ...

  8. LeetCode 10 正则表达式匹配

    https://leetcode-cn.com/problems/regular-expression-matching/ 解决方案 class Solution {public boolean is ...

  9. 《刷题笔记》牛客网 字符集合(一刷)

    <刷题笔记>牛客网 字符集合(一刷) 文章目录 <刷题笔记>牛客网 字符集合(一刷) 1.题目分析: 2. 思路分析 3. 代码: 总结 1.题目分析: 本题有多组输入,题目的 ...

  10. leetcode分类刷题笔记

    leetcode分类刷题笔记--基于python3 写在前面 1.做题如果实在想不出时间复杂度比较优的解法,可以先写出暴力解法,尝试在其基础上优化 2.排序.双指针.二分等--经常可以优化时间复杂度 ...

最新文章

  1. C++常见面试题之数据结构和算法
  2. python函数图像加标签_tkinter(py3)更改图像标签,函数内部,实时
  3. Beautiful Array
  4. Windows勾子处理类Thook 以及示例
  5. linux6.6 sudo环境变量,linux sudo环境变量设置
  6. sql运算符_SQL AND运算符解释语法示例
  7. android动画之布局动画,Android动画--布局动画 LayoutAnimation
  8. java 从已知日期计算干支纪日_两个日期计算
  9. 搭建linux环境的tomcat服务器
  10. 写给程序员和UI--Android的切图标准
  11. 小程序模板订阅操作【小程序订阅消息】
  12. 2022年证券从业资格证券投资基金考试多选题专练及答案
  13. 加载插件Apk中的类
  14. 《刻意练习》读书心得 驳斥1万小时定律、有目的的练习、自我实现的预言、走出舒适区
  15. 1 STM32F407ZG的简单介绍
  16. ajax 中的contentType
  17. 对 oc 学习的 阶段反思
  18. 【金三银四】 一文弄懂 js 数据类型、堆栈内存、作用域(链)、闭包知识拓展 (一)
  19. Wulihub设计文档类在线托管分享平台
  20. HTML文档基本格式详细介绍

热门文章

  1. 毕设题目:Matlab优化充电
  2. 【优化算法】未来搜索优化算法(FSA)【含Matlab源码 1448期】
  3. 【图像处理基础】基于matlab GUI图片浏览器【含Matlab源码 1015期】
  4. 【语音隐写】基于matlab GUI DWT音频数字水印【含Matlab源码 712期】
  5. 【背包问题】基于matlab量子免疫克隆算法求解背包问题【含Matlab源码 424期】
  6. 【车间调度】基于matlab粒子群算法求解6X6车间调度问题【含Matlab源码 411期】
  7. 【数字信号】基于matlab 8级m序列【含Matlab源码 353期】
  8. python执行sql语句慢很多_Python学习教程:面试问:一条SQL语句执行得很慢的原因有哪些?...
  9. 游戏行业数据类丛书_理论丛书:高维数据101
  10. 算法与数据结构篇(暂未解答)