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 ...
随机推荐
- moment实现计算两个时间的差值
var m1 = moment('2018-08-14 11:00:00'), m2 = moment('2018-08-14 12:10:00'); console.log(m1)console.l ...
- springboot集成Spring Data JPA数据查询
1.JPA介绍 JPA(Java Persistence API)是Sun官方提出的Java持久化规范.它为Java开发人员提供了一种对象/关联映射工具来管理Java应用中的关系数据.它的出现主要是为 ...
- 手把手教你如何在Windows下allure与jenkins的集成生成让你一见钟情的测试报告 - 03(非常详细,非常实用)
简介 好了,国庆假期结束,开始搬砖.为什么要把allure和jenkins集成了?原因是集成以后,我们就可以直接查看allure的结果,不需要重复输入命令.重复使用浏览器打开文件来查看allure的结 ...
- linux mint 19.2与Windows 10 双系统硬盘安装与卸载
安装linux mint 和win10双系统: 1.win10系统下如果没有空闲分区,请从容量较大的分区用partition manager在选中的较大的分区下,调整大小.此步骤最好在pe下的part ...
- 基于.NET环境,C#语言 实现 TCP NAT
基于.NET平台和C#语言实现TCP NAT穿越 1.<C# WinForm 跨线程访问控件(实用简洁写法)> 2.<基于.NET环境,C#语言 实现 TC ...
- Hbase入门(五)——客户端(Java,Shell,Thrift,Rest,MR,WebUI)
Hbase的客户端有原生java客户端,Hbase Shell,Thrift,Rest,Mapreduce,WebUI等等. 下面是这几种客户端的常见用法. 一.原生Java客户端 原生java客户端 ...
- orm加强版
目录 十三式 2式(针对外键查询优化) select_related和prefetch_related prefetch_related 查询返回值类型 不等式查询 关键字查询 时间查询 跨表查询 组 ...
- Java Intellij 第一个HelloWord
前言 最近重心点都在Java, 鉴于避免一些跟我一样学习Java开始啥都不懂,不知如何下手,方便小白快速入门.故写下此文,鉴于分享. (前提是安装jdk, 建议使用版本是1.8) JDK 安装地址:h ...
- Java 操作Word表格——创建嵌套表格、添加/复制表格行或列、设置表格是否禁止跨页断行
本文将对如何在Java程序中操作Word表格作进一步介绍.操作要点包括 如何在Word中创建嵌套表格. 对已有表格添加行或者列 复制已有表格中的指定行或者列 对跨页的表格可设置是否禁止跨页断行 创建表 ...
- Focus on the Good 专注于好的方面
[1] Dealing with people is like digging for gold. When you go digging for an ounce of gold, you hav ...