golang力扣leetcode 10.正则表达式匹配

简介: golang力扣leetcode 10.正则表达式匹配

10.正则表达式匹配

10.正则表达式匹配

题解

题目:正则匹配,s主串,p正则表达式,返回能否匹配成功

思路:动态规划

1.定义dp[i][j]:在s串中前i位,p串中前j位,是否匹配成功
2.如果p能匹配当前字符,或者p为.  则dp[i][j] = dp[i-1][j-1]
3.如果p为*,则可以匹配0次或多次
4.如果dp[i][j-2]=true,说明匹配0次是成功的,匹配0次看前两位状态
5.如果不能匹配0次,说明需要匹配1次或多次,prev := p[j-2]
6.如果前一位字符prev匹配s的当前字符,或者prev=. ,则有机会匹配成功,如果不等于s的当前字符或不为. ,说明肯定不成功
7.有机会匹配成功dp[i][j] = dp[i-1][j],需要看前一个字符是否匹配成功

代码

func isMatch(s string, p string) bool {
  n := len(s) + 1
  m := len(p) + 1
  dp := make([][]bool, n)
  for i := range dp {
    dp[i] = make([]bool, m)
  }
  //空串匹配
  dp[0][0] = true
  //初始化边界,p与空串的匹配
  for i := 1; i < m; i++ {
    chP := p[i-1]
    if chP == '*' {
      dp[0][i] = dp[0][i-2]
    }
  }
  //dp开始
  for i := 1; i < n; i++ {
    chS := s[i-1]
    for j := 1; j < m; j++ {
      chP := p[j-1]
      //p能匹配当前字符,或者p为.
      if chP == chS || chP == '.' {
        dp[i][j] = dp[i-1][j-1]
      } else if chP == '*' { //p为前为*
        if dp[i][j-2] { //* 匹配0次,看前两位的状态
          dp[i][j] = true
        } else {
          prev := p[j-2]
          if prev == chS || prev == '.' {//p的前一位匹配当前字符,或p为.
            dp[i][j] = dp[i-1][j] //* 匹配一次或多次,看前一位的状态
          }
        }
      }
    }
  }
  return dp[n-1][m-1]
}
目录
相关文章
|
3月前
2670.找出不同元素数目差数组-力扣(LeetCode)
2670.找出不同元素数目差数组-力扣(LeetCode)
22 0
|
3月前
|
索引
821.字符的最短距离-力扣(LeetCode)
821.字符的最短距离-力扣(LeetCode)
23 0
|
4月前
|
算法 数据可视化 数据挖掘
最佳加油站选择算法:解决环路加油问题的两种高效方法|LeetCode力扣134
最佳加油站选择算法:解决环路加油问题的两种高效方法|LeetCode力扣134
|
4月前
|
存储 算法 数据可视化
LeetCode 力扣题目:买卖股票的最佳时机 IV
LeetCode 力扣题目:买卖股票的最佳时机 IV
|
4月前
|
存储 算法 数据可视化
LeetCode 力扣题目:买卖股票的最佳时机 III
LeetCode 力扣题目:买卖股票的最佳时机 III
|
5天前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
2月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
44 6
|
2月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
82 2
|
5天前
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
|
2月前
|
索引 Python
【Leetcode刷题Python】从列表list中创建一颗二叉树
本文介绍了如何使用Python递归函数从列表中创建二叉树,其中每个节点的左右子节点索引分别是当前节点索引的2倍加1和2倍加2。
38 7
下一篇
无影云桌面