当前位置: 首页 > wzjs >正文

wordpress-Cosy主题seo算法优化

wordpress-Cosy主题,seo算法优化,山东省建设建设协会网站,网站怎么弄缩略图上传🚀 用动态规划实现正则表达式匹配:支持 . 和 * 在这篇文章中,我们将深入探讨如何实现一个正则表达式匹配引擎,支持两个基础通配符: .:匹配任意一个字符*:匹配零个或多个前面的字符 该问题是 …

🚀 用动态规划实现正则表达式匹配:支持 .*

在这篇文章中,我们将深入探讨如何实现一个正则表达式匹配引擎,支持两个基础通配符:

  • .:匹配任意一个字符
  • *:匹配零个或多个前面的字符

该问题是 LeetCode 上的经典题目,也常出现在算法面试中。我们将重点分析动态规划的解法,比较不同方法的优劣,并分析时间复杂度与空间复杂度。


🧩 问题描述

给定一个字符串 s 和一个字符模式 p,实现一个函数来匹配它们。支持以下规则:

  • . 匹配任意一个字符;
  • * 匹配零个或多个前面的字符。

⚠️ 注意:匹配必须覆盖整个字符串,而不是部分匹配。


🧠 解题思路

这是一个典型的动态规划(DP)问题,满足:

  1. 最优子结构:一个大问题的解可以通过子问题的解推导出来。
  2. 子问题重叠:很多状态会重复出现,比如重复处理同样前缀。
  3. 无后效性:状态转移只依赖当前状态,不依赖“历史路径”。

我们使用一个二维布尔数组 dp[i][j] 来表示:

字符串 s 的前 i 个字符 s[0..<i] 是否匹配模式 p 的前 j 个字符 p[0..<j]


✅ 动态规划解法(Swift 实现)

func isMatch(_ s: String, _ p: String) -> Bool {let sChars = Array(s), pChars = Array(p)let m = sChars.count, n = pChars.countvar dp = Array(repeating: Array(repeating: false, count: n + 1), count: m + 1)dp[0][0] = true  // 空串匹配空模式// 初始化:空串与形如 a*, a*b*, a*b*c* 这样的模式匹配for j in 1...n {if pChars[j - 1] == "*" && j >= 2 {dp[0][j] = dp[0][j - 2]}}for i in 1...m {for j in 1...n {if pChars[j - 1] == "." || pChars[j - 1] == sChars[i - 1] {dp[i][j] = dp[i - 1][j - 1]} else if pChars[j - 1] == "*" {// 1. 看作前一个字符重复0次dp[i][j] = dp[i][j - 2]// 2. 看作前一个字符重复 >=1 次if pChars[j - 2] == "." || pChars[j - 2] == sChars[i - 1] {dp[i][j] = dp[i][j] || dp[i - 1][j]}}}}return dp[m][n]
}

🧮 时间复杂度与空间复杂度

指标复杂度
时间复杂度O(m × n)
空间复杂度O(m × n)

其中 m 是字符串 s 的长度,n 是模式 p 的长度。我们用一个二维数组记录了所有子状态。

可以进一步优化空间复杂度为 O(n) 使用滚动数组(只保留前一行),但实现会复杂一些。


🧪 示例

isMatch("aa", "a")          // false
isMatch("aa", "a*")         // true
isMatch("ab", ".*")         // true
isMatch("aab", "c*a*b")     // true
isMatch("mississippi", "mis*is*p*.") // false

🚫 其他方法对比

1. 递归(暴力法)

思路:每遇到 * 时考虑多个递归分支。简单直观,但效率低。

func isMatch(_ s: String, _ p: String) -> Bool {if p.isEmpty { return s.isEmpty }let firstMatch = !s.isEmpty && (s.first == p.first || p.first == ".")if p.count >= 2 && p[p.index(p.startIndex, offsetBy: 1)] == "*" {return isMatch(s, String(p.dropFirst(2))) || (firstMatch && isMatch(String(s.dropFirst()), p))} else {return firstMatch && isMatch(String(s.dropFirst()), String(p.dropFirst()))}
}
  • ✅ 简洁,但容易爆栈
  • ❌ 时间复杂度指数级 O(2^(m+n))

2. 正则表达式库(逃避法)

Swift 提供了 NSRegularExpression,但题目要求自己实现匹配逻辑,不能用现成库。


✅ 总结

方法时间复杂度空间复杂度是否推荐
递归O(2^(m+n))O(m+n)
动态规划O(m × n)O(m × n)
动态规划(优化)O(m × n)O(n)✅ (进阶)
正则库调用❌(不符合题意)

📌 总结一句话

动态规划是解决字符串匹配类问题最稳定的武器,核心在于定义合理的状态和转移关系,写对了就赢了!


如果你喜欢这类算法解析,欢迎点赞、评论或收藏支持 👏

http://www.dtcms.com/wzjs/506061.html

相关文章:

  • 深圳做网站比较商城小程序
  • 深圳平台网站建设有源码怎么搭建网站
  • 建设网站需要体现的流程有哪些内容信息流优化师前景
  • php语言的网站建设抖音seo运营模式
  • 在哪注册网站百度快照手机版
  • 企业宣传册封面素材关键词seo排名怎么选
  • 女装wordpress桔子seo网
  • 小说网站自动采集网络优化工资一般多少
  • 在家自己做网站免费seo网站优化工具
  • 商业计划的网站建设费用惠州网络推广平台
  • 有没有什么排版的网站百度联系电话
  • wordpress运行php文件下载百度seo排名优化排行
  • 重庆网站制作公司电话购买友情链接网站
  • 禅城网站建设代理百度seo提高排名费用
  • 网页设计亮点介绍和心得体会佛山seo关键词排名
  • 免费搭建网站的平台开鲁网站seo不用下载
  • 可信网站认证必须做吗西安关键词排名首页
  • 网站建设的途径英雄联盟韩国
  • 产权交易网站建设方案seo关键词排名优化怎样收费
  • 物流网站大全seo的特点是什么
  • 医院网站建设 费用推广软文怎么写
  • 手机怎么浏览国外网站公司推广网站
  • 推客易可以做自己的网站吗网络营销策略存在的问题
  • 做MAD生肉网站优化神马排名软件
  • 程序_做彩票源码网站开发太原seo快速排名怎么样
  • 电子商务网站建设课程总结优化网站seo公司
  • 网站开发销售提成上首页seo
  • 智能响应式网站建设谷歌收录查询工具
  • WordPress 虎嗅主题免费seo网站排名优化工具
  • 南阳定制网站制作价格低深圳seo推广