剑指 Offer 19. 正则表达式匹配

https://leetcode-cn.com/problems/zheng-ze-biao-da-shi-pi-pei-lcof/

请实现一个函数用来匹配包含’. ‘和’‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’'表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但与"aa.a"和"ab*a"均不匹配。

输入:
s = "aa"
p = "a"
输出: false
解释: "a" 无法匹配 "aa" 整个字符串。
输入:
s = "aa"
p = "a*"
输出: true
解释: 因为 '*' 代表可以匹配零个或多个前面的那一个元素, 在这里前面的元素就是 'a'。因此,字符串 "aa" 可被视为 'a' 重复了一次。
输入:
s = "ab"
p = ".*"
输出: true
解释: ".*" 表示可匹配零个或多个('*')任意字符('.')。
输入:
s = "aab"
p = "c*a*b"
输出: true
解释: 因为 '*' 表示零个或多个,这里 'c' 为 0 个, 'a' 被重复一次。因此可以匹配字符串 "aab"。
输入:
s = "mississippi"
p = "mis*is*p*."
输出: false

动态规划

dp[i][j] = dp[i-1][j] // 多个字符匹配的情况
or dp[i][j] = dp[i][j-1] // 单个字符匹配的情况
or dp[i][j] = dp[i][j-2] // 没有匹配的情况
class Solution {public boolean isMatch(String s, String p) {int m = s.length();int n = p.length();boolean[][] f = new boolean[m + 1][n + 1];f[0][0] = true;for (int i = 0; i <= m; ++i) {for (int j = 1; j <= n; ++j) {if (p.charAt(j - 1) == '*') {f[i][j] = f[i][j - 2];  //前一个不匹配,拿的就是*的个数取0的情况if (matches(s, p, i, j - 1)) {  //前一个匹配的时候f[i][j] = f[i][j] || f[i - 1][j];}} else {if (matches(s, p, i, j)) {f[i][j] = f[i - 1][j - 1];}}}}return f[m][n];}public boolean matches(String s, String p, int i, int j) {if (i == 0) {return false;}if (p.charAt(j - 1) == '.') {return true;}return s.charAt(i - 1) == p.charAt(j - 1);}
}

有穷自动机

编译原理地时候学的有穷自动机。。自己写了一堆,发现做不出来。贴一份别人的代码。

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;class Solution {public boolean isMatch(String s, String p) {State nfa = createNfa(p);char[] chars = s.toCharArray();return backtrack(0, chars, nfa);}private static class State {private Map<Character, List<State>> trans = new HashMap<>();private boolean isFinal = false;}private State createNfa(String p) {char[] pattern = p.toCharArray();int len = pattern.length;State init = new State();State cur = init;int i = 0;while (i < len) {char c = pattern[i];if (i < len - 1 && pattern[i + 1] == '*') {State state = new State();state.trans.put(c, new ArrayList<>());state.trans.get(c).add(state);cur.trans.put('#', new ArrayList<>());cur.trans.get('#').add(state);cur = state;i += 2;} else {State state = new State();if (!cur.trans.containsKey(c)) {cur.trans.put(c, new ArrayList<>());}cur.trans.get(c).add(state);cur = state;i += 1;}}cur.isFinal = true;return init;}private boolean backtrack(int i, char[] chars, State state) {if (i == chars.length) {return isFinalState(state);}char c = chars[i];if (state.trans.containsKey(c)) {List<State> states = state.trans.get(c);for (State s : states) {boolean res = backtrack(i + 1, chars, s);if (res) {return true;}}}if (state.trans.containsKey('.')) {List<State> states = state.trans.get('.');for (State s : states) {boolean res = backtrack(i + 1, chars, s);if (res) {return true;}}}if (state.trans.containsKey('#')) {return backtrack(i, chars, state.trans.get('#').get(0));}return false;}private boolean isFinalState(State state) {if (state.isFinal == true) {return true;} else if (state.trans.containsKey('#')) {return isFinalState(state.trans.get('#').get(0));} else {return false;}}
}

剑指 Offer 19. 正则表达式匹配相关推荐

  1. 【LeetCode】剑指 Offer 19. 正则表达式匹配

    [LeetCode]剑指 Offer 19. 正则表达式匹配 文章目录 [LeetCode]剑指 Offer 19. 正则表达式匹配 package offer;public class Soluti ...

  2. 剑指 Offer 19. 正则表达式匹配 regex_match() regex()

    一. 题目: 剑指 Offer 19. 正则表达式匹配 请实现一个函数用来匹配包含'. '和''的正则表达式.模式中的字符'.'表示任意一个字符,而''表示它前面的字符可以出现任意次(含0次).在本题 ...

  3. 【LeetCode笔记】剑指Offer 19. 正则表达式匹配(Java、动态规划)

    文章目录 题目描述 思路 && 代码 二刷 打卡第十二天- 题目描述 拖了超级久的一道题= =,懒得看正则表达式,但是其实和正则表达式相关的地方也不多 思路 && 代码 ...

  4. 剑指offer:正则表达式匹配

    题目描述 请实现一个函数用来匹配包括'.'和''的正则表达式.模式中的字符'.'表示任意一个字符,而''表示它前面的字符可以出现任意次(包含0次). 在本题中,匹配是指字符串的所有字符匹配整个模式.例 ...

  5. 剑指offer之正则表达式匹配

    题目 请实现一个函数用来匹配包括.和*的正则表达式.模式中的字符.表示任意一个字符,而*表示它前面的字符可以出现任意次(包含0次). 在本题中,匹配是指字符串的所有字符匹配整个模式.例如,字符串aaa ...

  6. 剑指offer(19): 顺时针打印矩阵

    题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数 ...

  7. leetcode 打印_剑指 Offer 总结 - leetcode 剑指offer系列

    剑指 Offer 系列完结撒花!! 本篇文章是对整个系列的精华总结, 对系列的每篇文章进行了分类, 并用一句话概括每道题的思路, 方便大家理解和记忆, 当然也包含原文完整链接供大家参考 总的来说, 写 ...

  8. C#LeetCode刷题-剑指Offer

    本文由 比特飞 原创发布,欢迎大家踊跃转载. 转载请注明本文地址:C#LeetCode刷题-剑指Offer | .Net中文网. C#LEETCODE刷题概述 概述 所有LeetCode剑指Offer ...

  9. 剑指offer (From Leetcode) 汇总

    剑指 Offer 03. 数组中重复的数字 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知 ...

最新文章

  1. python播放音频及playsound模块解除占用的3种方法
  2. 【原创】有关Silverlight中“DataGrid中级联动态绑定父/子ComboBox ”的示例。
  3. 查看ubuntu linux开放的端口以及控制端口范围
  4. 在学术论文投稿时你遇到过最奇葩的审稿意见是什么?
  5. pythonos模块_Python3 入门教程——os模块使用(文件/目录操作)
  6. Storm性能简单测试
  7. apache ant 安装_Jmeter+ Ant+jenkins 接口自动化框架实现
  8. ajax-FormData快速序列化表单数据以及文件上传
  9. 标准 C I/O函数
  10. Ubuntu系统安装向日葵
  11. AWE2020:黄金十年再踏征程,以科技“智竞”未来
  12. OPNET 学习系列(一)
  13. 网站导航应该怎么设计?
  14. 机器学习在生活中的九大有趣应用
  15. php是一种什么脚本语言
  16. JSP书香味道点餐系统课设
  17. Win11怎么改系统语言?Win11系统语言简体改繁体的方法
  18. 对集合进行求交集、并集、差集
  19. 【JAVA】贪吃蛇的初步实现(三)
  20. Microsoft 离线翻译引擎介绍

热门文章

  1. 【转】跟着动画来学习TCP三次握手和四次挥手
  2. android相机底层配置ZSD菜单
  3. 虹膜识别—DeepIrisNet2
  4. 全智贤​成为FILA菁英运动代言人;欧莱雅静华大厦新园区落户上海 | 知消
  5. __attribute_((naked))
  6. mysql服务怎么启动和关闭?
  7. 佳能Canon PIXMA MG2545S 打印机驱动
  8. 大数据助力智慧物流,新一代物流产业数据价值分析
  9. C语言中比较两数的大小——三种方法
  10. 你离心想事成只差一个计划 | 进击