Leetcode(10)正则表达式匹配

[题目表述]:

给定一个字符串 (s) 和一个字符模式 (p)。实现支持 '.' 和 '*' 的正则表达式匹配。

'.' 匹配任意单个字符。

'*' 匹配零个或多个前面的元素。

匹配应该覆盖整个字符串 (s) ,而不是部分字符串。

第一次:未完成(未能解决.*问题

  1. class Solution:
  2. def isMatch(self, s: str, p: str) -> bool:
  3. index_s=0
  4. index_p=0
  5. form_num=''
  6. if len(s)==0:
  7. if len(p)==0 or p==".*": return True
  8. else: return False
  9. if len(p)==0:
  10. return False
  11. for i in p: ##s p都不为空
  12. if index_s==len(s): return False
  13. elif i==s[index_s] or i=='.':
  14. form_num=p[index_p]
  15. index_s+=1
  16. index_p+=1
  17. elif i=='*':
  18. if index_p==0:
  19. form_num=p[index_p]
  20. index_p+=1
  21. elif form_num=='.':
  22. ##if index_p!=len(s):
  23. ## 没有很好的办法去处理.*后面还有字符的问题
  24. ##else: return True
  25. elif form_num==s[index_s]:
  26. while form_num==s[index_s]:
  27. index_s+=1
  28. if index_s==len(s): return True
  29. form_num=p[index_p]
  30. index_p+=1
  31. else:
  32. form_num=p[index_p]
  33. index_p+=1
  34. elif p[index_p+1]=='*':
  35. form_num=p[index_p]
  36. index_p+=1
  37. else: return False
  38. if index_s!=len(s): return False
  39. else: return True

第二种方法:二维List动态规划dp

执行用时:80 ms ; 内存消耗:13MB 效果:很好

  1. class Solution:
  2. def isMatch(self, s: str, p: str) -> bool:
  3. #if not s or not p:
  4. #return False
  5. s_len = len(s)
  6. p_len = len(p)
  7. dp = [[False] * (p_len + 1) for _ in range(s_len + 1)]
  8. #print(dp)
  9. dp[0][0] = True
  10. for i in range(p_len):
  11. if p[i] == "*" and dp[0][i - 1]:
  12. dp[0][i + 1] = True
  13. #print(dp)
  14. for i in range(s_len):
  15. for j in range(p_len):
  16. if p[j] == s[i] or p[j] == ".":
  17. dp[i + 1][j + 1] = dp[i][j]
  18. elif p[j] == "*":
  19. if p[j - 1] != s[i]:
  20. dp[i + 1][j + 1] = dp[i + 1][j - 1]
  21. if p[j-1] == s[i] or p[j-1] == ".":
  22. dp[i+1][j+1] = (dp[i][j+1] or dp[i+1][j] or dp[i+1][j-1])
  23. #print(dp)
  24. return dp[-1][-1]

学习

  • 正则表达式的解法不是从前往后解,而是从后往前解,所以复杂点应该是用回溯法,而非第一次的从前遍历
  • 待解

第三次:递归

执行用时:1880 ms;内存消耗:11.8MB; 效果:不咋样

  1. class Solution:
  2. def isMatch(self, s, p):
  3. """
  4. :type s: str
  5. :type p: str
  6. :rtype: bool
  7. """
  8. in_str = s
  9. pt = p
  10. if not pt:
  11. return not in_str
  12. first_match = bool(in_str) and pt[0] in {in_str[0], '.'}
  13. if len(pt) >= 2 and pt[1] == '*':
  14. return (self.isMatch(in_str, pt[2:])
  15. or first_match and self.isMatch(in_str[1:], pt))
  16. else:
  17. return first_match and self.isMatch(in_str[1:], pt[1:])
  18. s = Solution()
  19. print(s.isMatch("ab", "c*ab"))

Leetcode(10)正则表达式匹配的更多相关文章

  1. Leetcode 10. 正则表达式匹配 - 题解

    版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C#版 - L ...

  2. Java实现 LeetCode 10 正则表达式匹配

    10. 正则表达式匹配 给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配. '.' 匹配任意单个字符 '*' 匹配零个或多个前面的那一个元素 所谓匹配, ...

  3. [LeetCode] 10. 正则表达式匹配

    题目链接:https://leetcode-cn.com/problems/regular-expression-matching/ 题目描述: 给定一个字符串 (s) 和一个字符模式 (p).实现支 ...

  4. LeetCode 10. 正则表达式匹配(Regular Expression Matching)

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

  5. LeetCode 10——正则表达式匹配

    1. 题目 2. 解答 在 回溯算法 中我们介绍了一种递归的思路来求解这个问题. 此外,这个问题也可以用动态规划的思路来解决.我们定义状态 \(P[i][j]\) 为子串 \(s[0, i)\) 和 ...

  6. leetcode题目10.正则表达式匹配(困难)

    题目描述: 给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配. '.' 匹配任意单个字符'*' 匹配零个或多个前面的那一个元素所谓匹配,是要涵盖 整个  ...

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

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

  8. LeetCode10. 正则表达式匹配

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

  9. leetcode 10 Regular Expression Matching(简单正则表达式匹配)

    最近代码写的少了,而leetcode一直想做一个python,c/c++解题报告的专题,c/c++一直是我非常喜欢的,c语言编程练习的重要性体现在linux内核编程以及一些大公司算法上机的要求,pyt ...

随机推荐

  1. moment实现计算两个时间的差值

    var m1 = moment('2018-08-14 11:00:00'), m2 = moment('2018-08-14 12:10:00'); console.log(m1)console.l ...

  2. springboot集成Spring Data JPA数据查询

    1.JPA介绍 JPA(Java Persistence API)是Sun官方提出的Java持久化规范.它为Java开发人员提供了一种对象/关联映射工具来管理Java应用中的关系数据.它的出现主要是为 ...

  3. 手把手教你如何在Windows下allure与jenkins的集成生成让你一见钟情的测试报告 - 03(非常详细,非常实用)

    简介 好了,国庆假期结束,开始搬砖.为什么要把allure和jenkins集成了?原因是集成以后,我们就可以直接查看allure的结果,不需要重复输入命令.重复使用浏览器打开文件来查看allure的结 ...

  4. linux mint 19.2与Windows 10 双系统硬盘安装与卸载

    安装linux mint 和win10双系统: 1.win10系统下如果没有空闲分区,请从容量较大的分区用partition manager在选中的较大的分区下,调整大小.此步骤最好在pe下的part ...

  5. 基于.NET环境,C#语言 实现 TCP NAT

    基于.NET平台和C#语言实现TCP NAT穿越        1.<C# WinForm 跨线程访问控件(实用简洁写法)>       2.<基于.NET环境,C#语言 实现 TC ...

  6. Hbase入门(五)——客户端(Java,Shell,Thrift,Rest,MR,WebUI)

    Hbase的客户端有原生java客户端,Hbase Shell,Thrift,Rest,Mapreduce,WebUI等等. 下面是这几种客户端的常见用法. 一.原生Java客户端 原生java客户端 ...

  7. orm加强版

    目录 十三式 2式(针对外键查询优化) select_related和prefetch_related prefetch_related 查询返回值类型 不等式查询 关键字查询 时间查询 跨表查询 组 ...

  8. Java Intellij 第一个HelloWord

    前言 最近重心点都在Java, 鉴于避免一些跟我一样学习Java开始啥都不懂,不知如何下手,方便小白快速入门.故写下此文,鉴于分享. (前提是安装jdk, 建议使用版本是1.8) JDK 安装地址:h ...

  9. Java 操作Word表格——创建嵌套表格、添加/复制表格行或列、设置表格是否禁止跨页断行

    本文将对如何在Java程序中操作Word表格作进一步介绍.操作要点包括 如何在Word中创建嵌套表格. 对已有表格添加行或者列 复制已有表格中的指定行或者列 对跨页的表格可设置是否禁止跨页断行 创建表 ...

  10. Focus on the Good 专注于好的方面

    [1]  Dealing with people is like digging for gold. When you go digging for an ounce of gold, you hav ...