2021-07-02:正则表达式匹配。给定一个字符串s和一个匹配串p。".“匹配单个字符。”"匹配左边元素的多个字符。判断p是否匹配s。比如s=“ab”,p=“a.”,返回true。比如s=“ab”,p="a",返回false。比如s=“aaa”,p=“a*”,返回true。比如s=“moonfdd”,p="kmoonfdd",返回true,因为""表示零个或者多个,这里’k’表示0个。

福大大 答案2021-07-02:

为了更好的处理边界问题。s和p都追加"1"。比如s="",p=“cc”,加1后s=“1”,p=“cc1”。方法1递归和方法2动态规划都会用到。
1.自然智慧,递归。会递归就行,思想很重要。会了递归,动态规划也就会了。
si指针指向s中某个位置,pi指针指向p中某个位置。
1.1.pi+1不带星。
si指针右移1位,pi指针右移1位。
1.2.pi+1带星。
si指针右移1位,pi指针右移2位。匹配的时候。
si指针右移1位,pi指针右移0位。匹配的时候。
si指针右移0位,pi指针右移2位。匹配的时候和不匹配的时候。
2.动态规划。时间复杂度是O(MN),空间复杂度是O(MN)。

代码用golang编写。代码如下:

package main

import "fmt"

func main() {
s := "moonfdd"
p := "c*c*moonfddc*c*"
ret := isMatch(s, p)
fmt.Println(ret)
} //递归
func isMatch(s string, p string) bool {
s = s + "1"
p = p + "1"
return process(s, 0, p, 0)
} func process(s string, si int, p string, pi int) bool {
if si == len(s) && pi == len(p) {
return true
}
if si == len(s) || pi == len(p) {
return false
}
//pi+1是否是*
if pi+1 < len(p) && p[pi+1] == '*' {
if p[pi] == '.' || p[pi] == s[si] {
if process(s, si+1, p, pi) {
return true
}
if process(s, si+1, p, pi+2) {
return true
}
}
if process(s, si, p, pi+2) {
return true
}
} else {
if p[pi] == '.' || p[pi] == s[si] {
if process(s, si+1, p, pi+1) {
return true
}
}
}
return false
} // 动态规划版本 + 斜率优化
func isMatch3(str string, pattern string) bool {
s := str + "1"
p := pattern + "1"
N := len(s)
M := len(p)
dp := make([][]bool, N+1)
for i := 0; i < N+1; i++ {
dp[i] = make([]bool, M+1)
}
dp[N][M] = true
for j := M - 1; j >= 0; j-- {
dp[N][j] = (j+1 < M && p[j+1] == '*') && dp[N][j+2]
}
// dp[0..N-2][M-1]都等于false,只有dp[N-1][M-1]需要讨论
if N > 0 && M > 0 {
dp[N-1][M-1] = s[N-1] == p[M-1] || p[M-1] == '.'
}
for i := N - 1; i >= 0; i-- {
for j := M - 2; j >= 0; j-- {
if p[j+1] != '*' {
dp[i][j] = ((s[i] == p[j]) || (p[j] == '.')) && dp[i+1][j+1]
} else {
if (s[i] == p[j] || p[j] == '.') && dp[i+1][j] {
dp[i][j] = true
} else {
dp[i][j] = dp[i][j+2]
}
}
}
}
return dp[0][0]
}

执行结果如下:


左神java代码

2021-07-02:正则表达式匹配。给定一个字符串s和一个匹配串p。“.“匹配单个字符。“*“匹配左边元素的多个字符。判断p是否匹配s。比如s=“ab“,p=“a.“,返回true。比如s=“ab“的更多相关文章

  1. python练习:编写一个函数isIn,接受两个字符串作为参数,如果一个字符串是另一个字符串的一部分,返回True,否则返回False。

    python练习:编写一个函数isIn,接受两个字符串作为参数,如果一个字符串是另一个字符串的一部分,返回True,否则返回False. 重难点:定义函数的方法.使用str类型的find()函数,可以 ...

  2. 2021.07.02 P1383 高级打字机题解(可持久化平衡树)

    2021.07.02 P1383 高级打字机题解(可持久化平衡树) 分析: 从可以不断撤销并且查询不算撤销这一骚操作可以肯定这是要咱建一棵可持久化的树(我也只会建可持久化的树,当然,还有可持久化并查集 ...

  3. 2021.07.02 UVa1197 多路归并模板

    2021.07.02 UVa1197 多路归并模板 UVA11997 K Smallest Sums - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 分析: 题解 UVA11997 ...

  4. Js判断一个字符串是否包含一个子串

    Js中经常遇到判断一个字符串是否包含一个子串,java语言中有containes的方法,直接调用就可以了.除非引用第三方数据库,Js中没有contains方法. 为了实现更java语言中contain ...

  5. HashTable集合和练习题_计算一个字符串中每一个字符出现的次数

    HashTable集合 /** * java.util.Hashtable<K,V>集合 implement Map<K,V>接口 * Hashtable:底层也是一个哈希表, ...

  6. Java-map-第一题 (Map)利用Map,完成下面的功能: 从命令行读入一个字符串,表示一个年份,输出该年的世界杯冠军是哪支球队。如果该 年没有举办世界杯,则输出:没有举办世界杯。 附:世界杯冠军以及对应的夺冠年份,请参考本章附录。 附录

    第一题 (Map)利用Map,完成下面的功能: 从命令行读入一个字符串,表示一个年份,输出该年的世界杯冠军是哪支球队.如果该 年没有举办世界杯,则输出:没有举办世界杯. 附:世界杯冠军以及对应的夺冠年 ...

  7. 获取一个字符串中每一个字母出现的次数使用map集合

    package 获取字符串中单字符出现次数; import java.util.Scanner; import java.util.TreeMap; /* * 需求:获取一个字符串中每一个字母出现的次 ...

  8. oracle中一个字符串包含另一个字符串中的所有字符

    oracle中一个字符串包含另一个字符串中的所有字符 --解决监理报告中所勾选的标段信息,与该用户所管理的标段字符串不匹配的问题. select * from a where instr(a,b)&g ...

  9. Java 一个字符串在另外一个字符串出现次数

    统计一个字符串在另外一个字符串出现次数 代码如下: package me.chunsheng.javatest; import java.util.regex.Matcher; import java ...

  10. String 类中的几个练习--获取指定字符串中,大写字母、小写字母、数字的个数||获取一个字符串中,另一个字符串出现的次数

    package cn.homework.demo1; public class GetCount { /* * 获取一个字符串中,另一个字符串出现的次数 * 思想: * 1. indexOf到字符串中 ...

随机推荐

  1. Python学习笔记--文件的相关操作

    文件的读取操作 读操作 实现: read()--读完 read(10)--读取10个字节 readline()--将所有行并到一行输出 readlines()--一次读取一行 文件的关闭: 实现: 上 ...

  2. 快速构造Python爬虫请求,有这个网站就够了!

    引言 大家好,我是蜡笔小曦. 我们在通过程序向某个网页发起请求时,实际上是模拟浏览器进行http(超文本传输协议)请求,这就要求我们需要按照固定的格式进行代码构造. 一般请求数据分为三部分:请求行.请 ...

  3. [网鼎杯 2018]Fakebook

    1.解题过程 1.sql注入 访问web页面有一个login和join ![1](https://raw.githubusercontent.com/lanchuangdexingjian/Blog- ...

  4. 65.C++的输入流和输出流

    1.流的概念和流类库的结构   程序的输入指的是从输入文件将数据传送给程序,程序的输出指的是从程序将数据传送给输出文件.   C++输入输出包含以下三个方面的内容:   对系统指定的标准设备的输入和输 ...

  5. 人人皆可虚拟,直播还能这么玩?声网推出 MetaLive 元直播解决方案

    视频群聊.在线社交.电商带货.游戏竞技.......越来越多的场景融入了直播这一功能.无可厚非,直播可以拉近人与人间的距离,让彼此间的交流更具象.但传统直播场景更为强调主播个人的表现,用户多以围观.刷 ...

  6. Firefox、Edge下无法使用jQuery的css("margin")、css("padding”)和css("border")获取值

    今天遇到了浏览器的迷惑行为,在Edge上使用jQuery的css("margin")获取值,发现获取的是空值,换了Firefox也是如此.看了jquery官方原话,发现如下一段话R ...

  7. Linux文件上传下载--rz/sz命令

    原文地址:https://www.cnblogs.com/igoodful/p/14694038.html 1.rz 命令 1.1 命令简介 rz 命令(Receive ZMODEM),使用 ZMOD ...

  8. HTML+JS+CSS实现图片文件上传界面设计的例子

    在Java Web应用程序设计中文件上传功能的实现是一项非常重要的工作,本文中的例子程序实现了文件上传功能的界面设计.在Java Web应用程序设计中涉及到上传图片文件功能时,往往都需要对图片文件进行 ...

  9. Java -- 增强for循环(foreach)

    增强for循环 相对于经典for循环, foreach可以减少代码量,但不是所有情况下foreach都可以代替for循环 当需要修改元素的值或和下标相关的操作需要使用标准for循环 foreach格式 ...

  10. 遗传算法(启发式算法)—R实现

    遗传算法 遗传算法(Genetic Algorithm,GA)最早是由美国的 John holland于20世纪70年代提出,该算法是根据大自然中生物体进化规律而设计提出的.是模拟达尔文生物进化论的自 ...