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 ...
随机推荐
- Google Test入门教程:从下载到运行
本文以VS2019为例,自己的工程使用Debug x64,多线程调试DLL(/MDd),用户可以根据自己需求更改配置,只要所有配置前后统一即可. 第一步:clone Google Test源码 打开h ...
- SpringBootSecurity学习(12)前后端分离版之简单登录
前后端分离 前面讨论了springboot下security很多常用的功能,其它的功能建议参考官方文档学习.网页版登录的形式现在已经不是最流行的了,最流行的是前后端分离的登录方式,前端单独成为一个项目 ...
- 深入了解String,StringBuffer和StringBuilder三个类的异同
Java提供了三个类,用于处理字符串,分别是String.StringBuffer和StringBuilder.其中StringBuilder是jdk1.5才引入的. 这三个类有什么区别呢?他们的使用 ...
- C#2匿名方法中的捕获变量
乍一接触"匿名方法中的捕获变量"这一术语可能会优点蒙,那什么是"匿名方法中的捕获变量"呢?在章节未开始之前,我们先定义一个委托:public delegate ...
- 夯实Java基础系列23:一文读懂继承、封装、多态的底层实现原理
本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...
- (八十五)c#Winform自定义控件-引用区块
前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kwwwvagaa/NetWinformControl 码云:ht ...
- 视频作品《springboot基础篇》上线了
1.场景描述 第一个视频作品出炉了,<springboot基础篇>上线了,有需要的朋友可以直接点击链接观看.(如需购买,请通过本文链接购买) 2. 课程内容 课程地址:https://ed ...
- B-概率论-常见的概率分布模型
目录 常见的概率分布模型 一.离散概率分布函数 二.连续概率分布函数 三.联合分布函数 四.多项分布(Multinomial Distribution) 4.1 多项分布简介 4.2 多项分布公式解析 ...
- Java技能树-图片版
最近在总结技能树,打算先拓宽下视野和技术的广度,后面会详细研究每个常用的技术点,补充技术的深度!下面是我在ProcessOn上总结的,里面有些有注释,点击这里注册ProcessOn,点击这里,可查看或 ...
- 主动降噪(Active Noise Control)
智能耳机 人机交互 智能声学终端 智能耳机 智能音箱 智能听力器 喇叭单体 动圈喇叭 新材料 DLC 石墨烯 陶瓷单位 吸音材料 智能芯片 阵列式麦克风 声纹传感器 演算法 降噪算法 智能听力保护 A ...