Leetcode(10)正则表达式匹配
Leetcode(10)正则表达式匹配
[题目表述]:
给定一个字符串 (s) 和一个字符模式 (p)。实现支持 '.' 和 '*' 的正则表达式匹配。
'.' 匹配任意单个字符。
'*' 匹配零个或多个前面的元素。
匹配应该覆盖整个字符串 (s) ,而不是部分字符串。
第一次:未完成(未能解决.*问题
class Solution:
def isMatch(self, s: str, p: str) -> bool:
index_s=0
index_p=0
form_num=''
if len(s)==0:
if len(p)==0 or p==".*": return True
else: return False
if len(p)==0:
return False
for i in p: ##s p都不为空
if index_s==len(s): return False
elif i==s[index_s] or i=='.':
form_num=p[index_p]
index_s+=1
index_p+=1
elif i=='*':
if index_p==0:
form_num=p[index_p]
index_p+=1
elif form_num=='.':
##if index_p!=len(s):
## 没有很好的办法去处理.*后面还有字符的问题
##else: return True
elif form_num==s[index_s]:
while form_num==s[index_s]:
index_s+=1
if index_s==len(s): return True
form_num=p[index_p]
index_p+=1
else:
form_num=p[index_p]
index_p+=1
elif p[index_p+1]=='*':
form_num=p[index_p]
index_p+=1
else: return False
if index_s!=len(s): return False
else: return True
第二种方法:二维List动态规划dp
执行用时:80 ms ; 内存消耗:13MB 效果:很好
class Solution:
def isMatch(self, s: str, p: str) -> bool:
#if not s or not p:
#return False
s_len = len(s)
p_len = len(p)
dp = [[False] * (p_len + 1) for _ in range(s_len + 1)]
#print(dp)
dp[0][0] = True
for i in range(p_len):
if p[i] == "*" and dp[0][i - 1]:
dp[0][i + 1] = True
#print(dp)
for i in range(s_len):
for j in range(p_len):
if p[j] == s[i] or p[j] == ".":
dp[i + 1][j + 1] = dp[i][j]
elif p[j] == "*":
if p[j - 1] != s[i]:
dp[i + 1][j + 1] = dp[i + 1][j - 1]
if p[j-1] == s[i] or p[j-1] == ".":
dp[i+1][j+1] = (dp[i][j+1] or dp[i+1][j] or dp[i+1][j-1])
#print(dp)
return dp[-1][-1]
学习
- 正则表达式的解法不是从前往后解,而是从后往前解,所以复杂点应该是用回溯法,而非第一次的从前遍历
- 待解
第三次:递归
执行用时:1880 ms;内存消耗:11.8MB; 效果:不咋样
class Solution:
def isMatch(self, s, p):
"""
:type s: str
:type p: str
:rtype: bool
"""
in_str = s
pt = p
if not pt:
return not in_str
first_match = bool(in_str) and pt[0] in {in_str[0], '.'}
if len(pt) >= 2 and pt[1] == '*':
return (self.isMatch(in_str, pt[2:])
or first_match and self.isMatch(in_str[1:], pt))
else:
return first_match and self.isMatch(in_str[1:], pt[1:])
s = Solution()
print(s.isMatch("ab", "c*ab"))
Leetcode(10)正则表达式匹配的更多相关文章
- Leetcode 10. 正则表达式匹配 - 题解
版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C#版 - L ...
- Java实现 LeetCode 10 正则表达式匹配
10. 正则表达式匹配 给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配. '.' 匹配任意单个字符 '*' 匹配零个或多个前面的那一个元素 所谓匹配, ...
- [LeetCode] 10. 正则表达式匹配
题目链接:https://leetcode-cn.com/problems/regular-expression-matching/ 题目描述: 给定一个字符串 (s) 和一个字符模式 (p).实现支 ...
- LeetCode 10. 正则表达式匹配(Regular Expression Matching)
题目描述 给定一个字符串 (s) 和一个字符模式 (p).实现支持 '.' 和 '*' 的正则表达式匹配. '.' 匹配任意单个字符. '*' 匹配零个或多个前面的元素. 匹配应该覆盖整个字符串 (s ...
- LeetCode 10——正则表达式匹配
1. 题目 2. 解答 在 回溯算法 中我们介绍了一种递归的思路来求解这个问题. 此外,这个问题也可以用动态规划的思路来解决.我们定义状态 \(P[i][j]\) 为子串 \(s[0, i)\) 和 ...
- leetcode题目10.正则表达式匹配(困难)
题目描述: 给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配. '.' 匹配任意单个字符'*' 匹配零个或多个前面的那一个元素所谓匹配,是要涵盖 整个 ...
- 【LeetCode】正则表达式匹配(动态规划)
题目描述 给定一个字符串 (s) 和一个字符模式 (p).实现支持 '.' 和 '*' 的正则表达式匹配. '.' 匹配任意单个字符. '*' 匹配零个或多个前面的元素. 匹配应该覆盖整个字符串 (s ...
- LeetCode10. 正则表达式匹配
10. 正则表达式匹配 描述 给定一个字符串 (s) 和一个字符模式 (p).实现支持 '.' 和 '*' 的正则表达式匹配. '.' 匹配任意单个字符. '*' 匹配零个或多个前面的元素. 匹配应该 ...
- leetcode 10 Regular Expression Matching(简单正则表达式匹配)
最近代码写的少了,而leetcode一直想做一个python,c/c++解题报告的专题,c/c++一直是我非常喜欢的,c语言编程练习的重要性体现在linux内核编程以及一些大公司算法上机的要求,pyt ...
随机推荐
- PacMan 01——玩家移动
版权申明: 本文原创首发于以下网站: 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123 优梦创客的官方博客:https://91make.top ...
- List之ConcurrentModificationException异常
一.前言 Java开发工作中,集合类ArrayList应该是使用非常频繁了.在使用过程中,可能会遇到迭代删除的需求场景,此时如果代码书写不当,就会抛出 java.util.ConcurrentModi ...
- [vue] vue服务端渲染nuxt.js
初始化 使用脚手架工具 create-nuxt-app 快速创建 npx create-nuxt-app <项目名> npx create-nuxt-app 执行一些选择 在集成的服务器端 ...
- UML图标含义及记忆方法
记忆技巧: 箭头的一方为被动方(被调用者): 箭头的端点为主动方(调用者). 箭头为封闭三角形时,表示类间关系 箭头为半封闭尖括号时,表示类内关系.其中,虚线表示参数强制依赖关系,实线表示属性关系.一 ...
- 2019-ccpc秦皇岛现场赛
https://www.cnblogs.com/31415926535x/p/11625462.html 昨天和队友模拟了下今年秦皇岛的区域赛,,,(我全程在演 题目链接 D - Decimal 签到 ...
- 体验Code::Blocks下的C++编程
0.前言 在当前的行业发展和国际形势下,让更多的程序员思考跨平台编程问题.在众多的跨平台开发环境中,Code::Blocks具有独特的优势. 近二十年来,跨平台开发环境曾经如雨后春笋般产生,但是,由于 ...
- reduce方法应用技巧
定义和用法 reduce() 方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值. 注意: reduce() 对于空数组是不会执行回调函数的. 浏览器支持 方法 Chro ...
- 利用 SASS 简化 `nth-child` 样式的生成
考察如下的 HTML 片段,通过 CSS 的 nth-child() 伪选择器实现列表的颜色循环,比如每三个一次循环. <ul> <li>1</li> <li ...
- 【故障公告】docker swarm 集群问题引发的故障
我们的生产环境部署了 2 个 docker swarm 集群,集群 swarm-a 用于专门跑博客站点,集群 swarm-b 用于跑其他站点,manager 节点用了阿里云包月服务器,worker 节 ...
- Nebula 架构剖析系列(一)图数据库的存储设计
摘要 在讨论某个数据库时,存储 ( Storage ) 和计算 ( Query Engine ) 通常是讨论的热点,也是爱好者们了解某个数据库不可或缺的部分.每个数据库都有其独有的存储.计算方式,今天 ...