44. 通配符匹配

动态规划

做动态规划很简单,三步走:

第一步,判断可否用动态规划做,即判断是否满足两个条件:①最优子结构,②重叠子问题。显然该题求s与p是否match,可由其字串层层分解上来。

我语文不好一两句解释不清楚,不过看完这篇文章,基本就会判断是不是满足这两个条件了。

算法-动态规划 Dynamic Programming--从菜鸟到老鸟

第二步,描述状态。这个题的状态还是比较好描述的,boolean f[i][j] :表示子串s[0~i-1] 与子串p[0~j-1]是否match

第三步,找出状态转移方程以及初始状态:

最难的地方就在于如何找状态转移方程。

如何找?即分析当前状态由上层哪个或者哪些以及处理过的状态转换而来

假设题中没有*,那就简单了,状态转移方程为f[i][j] = f[i-1][j-1] && s[i]==p[j]

现在加上,我们就可以按情况讨论嘛,如果p[j]!='' ,那么状态转移方程就是f[i][j] = f[i-1][j-1] && s[i]p[j]

如果p[j]'' , 即可以代替0个、1个或者多个,对于的状态f[i][j]可以由f[i-1][j-1],f[i][j-1]和f[i-1][j]而来,即f[i][j] = f[i - 1][j - 1] || f[i - 1][j] || f[i][j - 1];

初始状态,显然f[0][0]=true

不过,还有一个初始状态很容易被遗忘:

当p以开头时

if (p.length() > 0 && p.charAt(0) == '
') {

f[0][1] = true;

}

代码

class Solution {
public boolean isMatch(String s, String p) {
String tp = ""; //处理p中多余的*
for (int i = 0; i < p.length(); i++) {
if (p.charAt(i) == '*') {
tp += '*';
while (i < p.length() && p.charAt(i) == '*') i++;
}
if (i < p.length()) {
tp += p.charAt(i);
}
}
p = tp; boolean[][] f = new boolean[s.length() + 1][p.length() + 1];
f[0][0] = true; // 注意,当p以*开头时
if (p.length() > 0 && p.charAt(0) == '*') {
f[0][1] = true;
} for (int i = 1; i <= s.length(); i++) {
for (int j = 1; j <= p.length(); j++) {
if (p.charAt(j - 1) == '*') {
f[i][j] = f[i - 1][j - 1] || f[i - 1][j] || f[i][j - 1];
} else {
f[i][j] = f[i - 1][j - 1] && (s.charAt(i - 1) == p.charAt(j - 1) || p.charAt(j - 1) == '?');
}
}
} return f[s.length()][p.length()];
}
}

[leetcode] 44. 通配符匹配(Java)(动态规划)的更多相关文章

  1. Java实现 LeetCode 44 通配符匹配

    44. 通配符匹配 给定一个字符串 (s) 和一个字符模式 § ,实现一个支持 '?' 和 '*' 的通配符匹配. '?' 可以匹配任何单个字符. '*' 可以匹配任意字符串(包括空字符串). 两个字 ...

  2. LeetCode 44. 通配符匹配(Wildcard Matching)

    题目描述 给定一个字符串 (s) 和一个字符模式 (p) ,实现一个支持 '?' 和 '*' 的通配符匹配. '?' 可以匹配任何单个字符. '*' 可以匹配任意字符串(包括空字符串). 两个字符串完 ...

  3. [Leetcode 44]通配符匹配Wildcard Matching

    [题目] 匹配通配符*,?,DP动态规划,重点是*的两种情况 想象成两个S.P长度的字符串,P匹配S. S中不会出现通配符. [条件] (1)P=null,S=null,TRUE (2)P=null, ...

  4. 【LeetCode】正则表达式匹配(动态规划)

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

  5. leetcode 44 字符匹配

    题意:s是空串或包含a-z字母: p为包含a-z字母或?或 * (其中*可以匹配任意字符串包括空串,?可以匹配任意字符). 思路: 1)特殊情况:当s为空串时,p为连续 * 时,则连续 * 的位置都为 ...

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

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

  7. LeetCode(44): 通配符匹配

    Hard! 题目描述: 给定一个字符串 (s) 和一个字符模式 (p) ,实现一个支持 '?' 和 '*' 的通配符匹配. '?' 可以匹配任何单个字符. '*' 可以匹配任意字符串(包括空字符串). ...

  8. 【BZOJ3507】通配符匹配(哈希,动态规划)

    [BZOJ3507]通配符匹配(哈希,动态规划) 题面 BZOJ 题解 对于匹配唯一存在影响的只有通配符,而\(?\)的影响也并不大,所以唯一需要仔细考虑的是\(*\). 考虑一个\(dp\),设\( ...

  9. [LeetCode][Facebook面试题] 通配符匹配和正则表达式匹配,题 Wildcard Matching

    开篇 通常的匹配分为两类,一种是正则表达式匹配,pattern包含一些关键字,比如'*'的用法是紧跟在pattern的某个字符后,表示这个字符可以出现任意多次(包括0次). 另一种是通配符匹配,我们在 ...

随机推荐

  1. 数据结构之Stack | 让我们一块来学习数据结构

    栈的介绍 栈就是和列表类似的一种数据结构,它可用来解决计算机世界里的很多问题.栈是一种高 效的数据结构,因为数据只能在栈顶添加或删除,所以这样的操作很快,而且容易实现. 栈的使用遍布程序语言实现的方方 ...

  2. spring boot 通过feign调用api接口

    目的:远程调用服务器api,直接上步骤: 1,添加maven依赖,这是必须的: <dependency> <groupId>org.springframework.cloud& ...

  3. 【接口设计】用户积分排行榜功能-Redis实现

    一.排行榜功能简介 排行榜功能是一个很普遍的需求.使用 Redis 中有序集合(SortedSet)的特性来实现排行榜是又好又快的选择. 一般排行榜都是有实效性的,比如交通数据流中的路口/路段的车流量 ...

  4. 【Idea】实用插件列表

    1.Translation : 翻译 2.CodeGlance:代码预览 3.Lombok:优雅编程插件 4.GenerateSerialVersionUID :自动生成序列化ID 5.CamelCa ...

  5. 一份释放root文件的脚本文件

    #!/system/bin/sh MYDIR=$3 ARGS=$4 SU=$MYDIR/au SUPOLICY=$MYDIR/supolicy BUSYBOX=$MYDIR/busybox TOOLB ...

  6. Linux文件共享服务之Samba

    目录 Samba Samba的配置 Samba Samba是一个能让Linux系统应用Microsoft网络通讯协议的软件,而SMB是Server Message Block的缩写,即为服务器消息块 ...

  7. node-util

    Node.js 常用工具 util 是一个Node.js 核心模块,提供常用函数的集合,用于弥补核心JavaScript 的功能 过于精简的不足. util.inherits util.inherit ...

  8. HTTP自定义Header-(SOCKET-TCP)

      HTTP自定义Header-TCP 前几天弄一些东西,需要在发送http请求的时候自定义http头,找了几个库用着很不爽.有的把Cookie直接干掉了,还自己在头里加了版权,最后终于忍不了了.在网 ...

  9. 中国石油大学(华东)数学实验(MATLAB)复习

    作者:张世琛 函数的导数 $$ 求函数y=log(x+\sqrt{1+x^2})的一阶和二阶导数 $$ syms x; y=log(x+sqrt(1+x^2)); dydx=diff(y,x); dy ...

  10. Linux系统运行netstat命令时的过三关斩一将

    1.简介 这篇文章主要是记录在日常工作中遇到的一些问题,将其都总结整合到一起,方便查看,提高工作效率.小伙伴们看到标题可能觉得奇怪,不是过五关斩六将而是过三关斩一将.慢慢地往后看发现其中奥秘. 2.过 ...