题目链接

题目描述

给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配。

  1. '.' 匹配任意单个字符
  2. '*' 匹配零个或多个前面的那一个元素

所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。

说明:

  • s 可能为空,且只包含从 a-z 的小写字母。
  • p 可能为空,且只包含从 a-z 的小写字母,以及字符 . 和 *。

示例 1

  1. 输入:
  2. s = "aa"
  3. p = "a"
  4. 输出: false
  5. 解释: "a" 无法匹配 "aa" 整个字符串。

示例 2

  1. 输入:
  2. s = "aa"
  3. p = "a*"
  4. 输出: true
  5. 解释: 因为 '*' 代表可以匹配零个或多个前面的那一个元素, 在这里前面的元素就是 'a'。因此,字符串 "aa" 可被视为 'a' 重复了一次。

示例 3

  1. 输入:
  2. s = "ab"
  3. p = ".*"
  4. 输出: true
  5. 解释: ".*" 表示可匹配零个或多个('*')任意字符('.')。

示例 4

  1. 输入:
  2. s = "aab"
  3. p = "c*a*b"
  4. 输出: true
  5. 解释: 因为 '*' 表示零个或多个,这里 'c' 0 个, 'a' 被重复一次。因此可以匹配字符串 "aab"

示例 5

  1. 输入:
  2. s = "mississippi"
  3. p = "mis*is*p*."
  4. 输出: false

题解 (回溯)

  1. public boolean isMatch(String text, String pattern) {
  2. if (pattern.isEmpty()) return text.isEmpty();
  3. boolean first_match = (!text.isEmpty() &&
  4. (pattern.charAt(0) == text.charAt(0) || pattern.charAt(0) == '.'));
  5. if (pattern.length() >= 2 && pattern.charAt(1) == '*'){
  6. return (isMatch(text, pattern.substring(2)) ||
  7. (first_match && isMatch(text.substring(1), pattern)));
  8. } else {
  9. return first_match && isMatch(text.substring(1), pattern.substring(1));
  10. }
  11. }

题解 (动态规划)

  1. public boolean isMatch(String text, String pattern) {
  2. boolean[][] dp = new boolean[text.length() + 1][pattern.length() + 1];
  3. dp[text.length()][pattern.length()] = true;
  4. for (int i = text.length(); i >= 0; i--){
  5. for (int j = pattern.length() - 1; j >= 0; j--){
  6. boolean first_match = (i < text.length() &&
  7. (pattern.charAt(j) == text.charAt(i) ||
  8. pattern.charAt(j) == '.'));
  9. if (j + 1 < pattern.length() && pattern.charAt(j+1) == '*'){
  10. dp[i][j] = dp[i][j+2] || first_match && dp[i+1][j];
  11. } else {
  12. dp[i][j] = first_match && dp[i+1][j+1];
  13. }
  14. }
  15. }
  16. return dp[0][0];
  17. }

复杂度分析

不是很懂,力扣题解有写,大家看那个吧。

手记

对我这个菜鸡来说,这题挺难。现在只看懂了官方题解,后面过段时间还要多练习下。

Java算法练习——正则表达式匹配的更多相关文章

  1. java中使用正则表达式匹配字符串

    在Java中使用正则表达式去匹配相应的字符串: String importFileRole = "(import)\\s*[a-zA-Z0-9_<>.]+\\;";// ...

  2. java 中 正则 正则表达式 匹配 url

    不多说 [http|https]+[://]+[0-9A-Za-z:/[-]_#[?][=][.][&]]* 这个就是匹配 网络上的网址 又称 url . 最起码 绝大部分的taobao ur ...

  3. Java中输出正则表达式匹配到的内容

    import java.util.regex.Matcher; import java.util.regex.Pattern; public class A { public static void ...

  4. 正则表达式匹配${key}并在Java中使用

    1.正则表达式匹配${key} \$\{([a-z]+)\} 能够匹配字符串中以${key}形式的文本(其中key为小写应为字母) .*\$\{([a-z]+)\}.* 可以用来检测文本中是否有${k ...

  5. 详解Java API之正则表达式

    正则表达式描述的是一种规则,符合这种限定规则的字符串我们认为它某种满足条件的,是我们所需的.在正则表达式中,主要有两种字符,一种描述的是普通的字符,另一种描述的是元字符.其中元字符是整个正则表达式的核 ...

  6. 正则表达式匹配可以更快更简单 (but is slow in Java, Perl, PHP, Python, Ruby, ...)

    source: https://swtch.com/~rsc/regexp/regexp1.html translated by trav, travmymail@gmail.com 引言 下图是两种 ...

  7. Java/Js下使用正则表达式匹配嵌套Html标签

    转自:http://www.jb51.net/article/24422.htm 以前写过一篇文章讲解如何使用正则表达式完美解决Html嵌套标签的匹配问题(使用正则表达式匹配嵌套Html标签),但是里 ...

  8. Java正则表达式匹配例子

    Java正则表达式匹配例子 package com.ibm.test; import java.util.regex.Matcher; import java.util.regex.Pattern; ...

  9. 【Java】 剑指offer(19) 正则表达式匹配

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 请实现一个函数用来匹配包含'.'和'*'的正则表达式.模式中的字符 ...

随机推荐

  1. Spring 通读官方文档

    Spring 通读官方文档 这部分参考文档涵盖了Spring Framework绝对不可或缺的所有技术. 其中最重要的是Spring Framework的控制反转(IoC)容器.Spring框架的Io ...

  2. AJAX的兼容处理方式

    AJAX在网站服务中使用到频率很高,也需要考虑各个浏览器版本的兼容性,本示例中详细介绍简单快捷的处理兼容性问题. <!DOCTYPE HTML> <html> <head ...

  3. 使用JavaScript和Canvas打造真实的雨滴效果

    使用JavaScript和Canvas打造真实的雨滴效果 寸志 · 1 年前 我最近搞了一个有趣的项目——rainyday.js .我认为这个项目并不怎么样,而且,事实上这是我第一次尝试接触一些比弹窗 ...

  4. Ternsorflow 学习:004-MNIST入门 构建模型

    Softmax回归介绍 我们知道MNIST的每一张图片都表示一个数字,从0到9.我们希望得到给定图片代表每个数字的概率.比如说,我们的模型可能推测一张包含9的图片代表数字9的概率是80%但是判断它是8 ...

  5. P1062 最简分数

    P1062 最简分数 转跳点:

  6. CCF 201703-4 地铁修建(最小生成树)

    题意:A市有n个交通枢纽,其中1号和n号非常重要,为了加强运输能力,A市决定在1号到n号枢纽间修建一条地铁.地铁由很多段隧道组成,每段隧道连接两个交通枢纽.经过勘探,有m段隧道作为候选,两个交通枢纽之 ...

  7. 3 JVM配置参数

  8. NIO 聊天室代码实现

    服务器端 package com.ronnie.nio.groupChat; import java.io.IOException; import java.net.InetSocketAddress ...

  9. chrome常用参数

    chrome禁止本地浏览时加载本地其他文件,可以采用添加启动参数的方式来支持 添加参数为 --allow-file-access-from-files 或者 --disable-web-securit ...

  10. P1057 数零壹

    P1057 数零壹 转跳点: