class Solution {
public boolean isMatch(String s, String p) {
if (p == null || p.length() == 0) {
return s == null || s.length() == 0;
}
boolean[][] dp = new boolean[s.length() + 1][p.length() + 1];
dp[0][0] = true;
int i, j; for (i = 1; i <= p.length(); i++) {
if (p.charAt(i - 1) == '*') {
dp[0][i] = true;
} else {
break;
}
} for (i = 1; i <= s.length(); i++) {
for (j = 1; j <= p.length(); j++) {
// the letter of p[j] exactly match with s[i] or is '?'
if (s.charAt(i - 1) == p.charAt(j - 1) || p.charAt(j - 1) == '?') {
dp[i][j] = dp[i - 1][j - 1];
} // the letter of p is '*'
if (p.charAt(j - 1) == '*') {
/*
* dp[i][j] = dp[i][j-1] means '*' act as empty card dp[i][j] = dp[i-1][j] means
* '*' act as wild card to match with s[i]
*/
dp[i][j] = dp[i][j - 1] || dp[i - 1][j];
}
}
}
return dp[s.length()][p.length()];
}
}

参考:https://leetcode.com/problems/wildcard-matching/discuss/429337/Java%3A-Wild-card!

补充一个python的实现:

 class Solution:
def isMatch(self, s: str, p: str) -> bool:
m,n = len(s),len(p)
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] = True
else:
break
for i in range(1,m+1):
for j in range(1,n+1):
if s[i-1] == p[j-1] or p[j-1] == '?':
dp[i][j] = dp[i-1][j-1]
elif p[j-1] == '*':
dp[i][j] = dp[i-1][j] or dp[i][j-1]
# print(dp)
return dp[m][n]

思路:动态规划。

举例分析:s='acdcb' p='a*c?b' 。s长度为m,p长度为n。

初始化二维数组dp,有m+1行,n+1列。

dp[0][0] = True,先设置第0行,如果p中对应字符是‘*’,则设置为True,遇到非'*'后面都设置为False。

从第1行开始,如果s与p中对应字符是相同或者p中是'?',则dp取其'左上角'元素的值。

如果p中的字符是'*',则dp判断其'上方'和'左侧'的逻辑或,(即上方或左侧是否为True)。

leetcode44的更多相关文章

  1. LeetCode44 Wildcard Matching

    题目: Implement wildcard pattern matching with support for '?' and '*'. '?' Matches any single charact ...

  2. [Swift]LeetCode44. 通配符匹配 | Wildcard Matching

    Given an input string (s) and a pattern (p), implement wildcard pattern matching with support for '? ...

  3. leetcode44:wildcard

    44. Wildcard Matching 问题描述 给定字符串s和模式p,判断字符串s是否完全符合模式p 其中字符串s只包含小写字母,模式串p包含小写字母.*.?,其中星号表示任意长度的任意字符串, ...

  4. LeetCode--44 通配符匹配

    题目就是说两个字符串,一个含有通配符,去匹配另一个字符串:输出两个字符串是否一致. 注意:’?’表示匹配任意一个字符,’*’表示匹配任意字符0或者多次 首先,我们想到暴力破解.如果从头到尾的破解,到第 ...

  5. Leetcode44. 通配符匹配(动态规划)

    44. 通配符匹配 动态规划 \(f_{i,j}\)为\(s\)匹配\(i\),\(t\)匹配\(j\)是否成功 贪心 相比之下这个思维性更强 考虑两个*,两个星号间的过渡,只需要过渡完到第二个星号, ...

随机推荐

  1. Ubuntu 14.10 下Hadoop FTP文件上传配置

    最近老板提出一个需求,要用Hadoop机群管理生物数据,并且生物数据很多动辄几十G,几百G,所以需要将这些数据传到HDFS中,在此之前搭建了HUE用来图形化截面管理HDFS数据,但是有个问题,上面使用 ...

  2. Docker启动一个Centos镜像

    docker镜像的获取与使用 docker中使用centos7镜像 接着上文,我们下载完成一个Centos镜像之后,开始启动 #运行命令 docker run -d -i -t <imageID ...

  3. Linux下静态库和动态库

    函数库分为静态库和动态库 动态库(格式为libname.so[.主版本号.次版本号.发行号]).在程序编译时并不会被链接到目标代码中,而是在程序运行时才被载入. 静态库是目标文件.a的归档文件(格式为 ...

  4. 事件之Touch 事件的分发和消费机制

    Android 中与 Touch 事件相关的方法包括:dispatchTouchEvent(MotionEvent ev).onInterceptTouchEvent(MotionEvent ev). ...

  5. [UE4]Canvas Panel

    一.Canvas Panel:画布.Canvas Panel中内的元素可以任何摆放位置.Canvas Panel是UserWiget默认的根节点容器,可以把跟节点删除替换生成任何的UI元素. 二.选择 ...

  6. linux 为什么要关闭selinux

    一般安装linux课程时都把SELinux与iptables安排在后面,使初学者配置linux服务器时不成功,却没有头绪,那是因为在RedHat linux操作系统中默认开启了防火墙,SELinux也 ...

  7. SpringMVC之HandlerAdapter解析

    HandlerAdapter字面上的意思就是处理适配器,它的作用用一句话概括就是调用具体的方法对用户发来的请求来进行处理.当handlerMapping获取到执行请求的controller时,Disp ...

  8. linux system()函数详解

    system(3) - Linux man page Name system - execute a shell command Synopsis #include <stdlib.h> ...

  9. SQLite3数据库

    #SQLite可视化管理工具(SQLite Expert Pro) SQLite特点: 1. 遵守ACID(原子性.一致性.隔离性和持久性)的关系型数据库管理系统:2. 不是一个C/S结构的数据库引擎 ...

  10. Ubuntu17.04下安装vmware虚拟机

    linux常用虚拟机一般为KVM,Vmware或者VirtualBox(简称VBox). 下面给大家介绍以下如何在ubuntu17.04版本上安装vmware虚拟机至于虚拟机是用来干啥的,在这里我就不 ...