class Solution {
public boolean isMatch(String s, String p) { if (s == null || p == null) {
return false;
}
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] = true;
}
}
for (int i = 0 ; i < s.length(); i++) {
for (int j = 0; j < p.length(); j++) {
if (p.charAt(j) == '.') {
dp[i+1][j+1] = dp[i][j];
}
if (p.charAt(j) == s.charAt(i)) {
dp[i+1][j+1] = dp[i][j];
}
if (p.charAt(j) == '*') {
if (p.charAt(j-1) != s.charAt(i) && p.charAt(j-1) != '.') {
dp[i+1][j+1] = dp[i+1][j-1];
} else {
dp[i+1][j+1] = (dp[i+1][j] || dp[i][j+1] || dp[i+1][j-1]);
}
}
}
}
return dp[s.length()][p.length()];
}
}

参考:https://leetcode.com/problems/regular-expression-matching/discuss/5651/Easy-DP-Java-Solution-with-detailed-Explanation

补充一个python的实现:

 class Solution:
def isMatch(self, s: 'str', p: 'str') -> 'bool':
m,n = len(s),len(p)
#dp[i][j]表示s[:i+1]是否可以匹配p[:j+1]
dp = [[False for _ in range(n+1)]for _ in range(m+1)]
#前提,空白字符可以匹配空白规则
dp[0][0] = True
#如果有*,则*前的字符可以省略
for j in range(1,n+1):
if (p[j-1] == '*'):
dp[0][j] = dp[0][j-2] for i in range(1,m+1):
for j in range(1,n+1):
if s[i-1] == p[j-1]:#s与p的当前位置上相同
dp[i][j] = dp[i-1][j-1]#当前位置与左上角(同时去掉s和p的当前位置后)匹配性相同
elif p[j-1] == '.':#p当前位置是'.',可以匹配任意1个字符
dp[i][j] = dp[i-1][j-1]#当前位置与左上角(同时去掉s和p的当前位置后)匹配性相同
elif p[j-1] == '*':#p当前位置是'*',可以匹配任意0个、1个或多个字符
if s[i-1] == p[j-2]:#s与p的前一位置上相同
#假设s字符串是ba,p模式串是ba*
#(b->ba*) or (ba->ba) or (ba->b)
#这三种只要有一种是True,就说明可以匹配
dp[i][j] = dp[i-1][j] or dp[i][j-1] or dp[i][j-2]
elif p[j-2] == '.':#再次使用 当前字符匹配性判断1
dp[i][j] = dp[i-1][j] or dp[i][j-1] or dp[i][j-2]
else:
dp[i][j] = dp[i][j-2] return dp[m][n]

本题与剑指Offer 19 正则表达式匹配是同一道题。

leetcode10的更多相关文章

  1. LeetCode10 Regular Expression Matching

    题意: Implement regular expression matching with support for '.' and '*'. '.' Matches any single chara ...

  2. [Swift]LeetCode10. 正则表达式匹配 | Regular Expression Matching

    Given an input string (s) and a pattern (p), implement regular expression matching with support for  ...

  3. LeetCode10. 正则表达式匹配

    10. 正则表达式匹配 描述 给定一个字符串 (s) 和一个字符模式 (p).实现支持 '.' 和 '*' 的正则表达式匹配. '.' 匹配任意单个字符. '*' 匹配零个或多个前面的元素. 匹配应该 ...

  4. LeetCode10.正则表达式匹配 JavaScript

    给定一个字符串 (s) 和一个字符模式 (p).实现支持 '.' 和 '*' 的正则表达式匹配. '.' 匹配任意单个字符. '*' 匹配零个或多个前面的元素. 匹配应该覆盖整个字符串 (s) ,而不 ...

  5. leetcode-10

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

  6. LeetCode10 Indexed tree

    Binary Indexed Tree(Fenwick tree): 是一个查询和修改复杂度都为log(n)的数据结构.主要用于查询任意两位之间的所有元素之和,但是每次只能修改一个元素的值:经过简单修 ...

  7. LeetCode10 Hard,带你实现字符串的正则匹配

    本文始发于个人公众号:TechFlow 这是LeetCode的第10题,题目关于字符串的正则匹配,我们先来看题目相关信息: Link Regular Expression Matching Diffi ...

  8. leetcode10 正则表达式匹配 dp

    刚好最近在学编译原理 有点想按照语法分析写..不过用不着 因为知道正则表达式对一个串可能有多种匹配方法,所以要准备好回溯. 有最优子结构,一段s由一段p生成,于是dp. 常规思路是从前开始逐个字符匹配 ...

  9. 快手4-5月Java岗面经

    快手面试准备 我的牛客网帖子链接:https://www.nowcoder.com/discuss/429362 一面: 基础知识 1.java基本数据类型(8种) 1.基本数据类型有哪些,各占多少位 ...

随机推荐

  1. npm 基本使用命令

    NMP 本地 远程npm install uglify-js --globalnpm install underscore@1.8.2 指定版本 npm update underscore npm s ...

  2. java特殊抽象类-接口

  3. 马凯军201771010116《面向对象程序设计(java)》第六周学习总结

    第一部分:理论知识学习部分 枚举是一种特殊的数据类型,之所以特殊是因为它既是一种类(class)类型却又比类型多了些特殊的约束,但是这些约束的存在也造就了枚举类型的简洁,安全性以及便捷性.创建枚举类型 ...

  4. canvas 绘画随机点

    直接看图吧: 这样的随机点,是小圆点组成的,然后一直在动,记录一下,万一以后要用到呢: canvas的具体设置我就不写了,另一篇文档里有: drawRandomDot () { let leftCan ...

  5. MySQL设置空密码

    因为刚安装的时候,MySQL强制设置密码,但是我需要设置MySQL为空密码 语句: ';

  6. 关于surface gradient

    [转载请注明出处]http://www.cnblogs.com/mashiqi 2017/06/16 函数定义及前后文详见<Inverse Acoustic and Electromagneti ...

  7. easyui datagrid去掉全选按钮

    第一步: F12查看元素,选中全选按钮,把全选按钮的class里边加上display:none属性.找到对应的class,即.datagrid-header-check. 第二步: 在加载 表格的时候 ...

  8. android ListView 可缩放,支持左右上下手势

    public class ZoomListView extends ListView implements SwipeListener { public static enum Action { Le ...

  9. Java 中int、String的类型转换

    int -> String int i=12345;String s="";第一种方法:s=i+"";第二种方法:s=String.valueOf(i); ...

  10. 1.2 VMware安装过程

    1.新建虚拟机后,选择[我以后再安装],否则安装过程看不到. 2.在虚拟机设置里,内存设置不能超过物理内存的一半. 3.创建硬盘 4.设置CD/ROM使用ISO镜像文件 5.创建[快照] 6.克隆虚拟 ...