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

东莞专业网站制作设计wordpress+主题+引入js

东莞专业网站制作设计,wordpress+主题+引入js,广州网站设计培训班,桂林漓江官网目录 力扣10. 正则表达式匹配 解析代码 力扣10. 正则表达式匹配 10. 正则表达式匹配 难度 困难 给你一个字符串 s 和一个字符规律 p#xff0c;请你来实现一个支持 . 和 * 的正则表达式匹配。 . 匹配任意单个字符* 匹配零个或多个前面的那一个元素 所谓匹配#xff0c…目录 力扣10. 正则表达式匹配 解析代码 力扣10. 正则表达式匹配 10. 正则表达式匹配 难度 困难 给你一个字符串 s 和一个字符规律 p请你来实现一个支持 . 和 * 的正则表达式匹配。 . 匹配任意单个字符* 匹配零个或多个前面的那一个元素 所谓匹配是要涵盖 整个 字符串 s的而不是部分字符串。 示例 1 输入s aa, p a 输出false 解释a 无法匹配 aa 整个字符串。示例 2: 输入s aa, p a* 输出true 解释因为 * 代表可以匹配零个或多个前面的那一个元素, 在这里前面的元素就是 a。因此字符串 aa 可被视为 a 重复了一次。示例 3 输入s ab, p .* 输出true 解释.* 表示可匹配零个或多个*任意字符.。提示 1 s.length  201 p.length  20s 只包含从 a-z 的小写字母。p 只包含从 a-z 的小写字母以及字符 . 和 *。保证每次出现字符 * 时前面都匹配到有效的字符 class Solution { public:bool isMatch(string s, string p) {} }; 解析代码 状态表示 对于两个字符串之间的 dp 问题一般的思考方式如下 选取第⼀个字符串的 [0, i] 区间以及第⼆个字符串的 [0, j] 区间当成研究对象结合题目的要求来定义状态表示。然后根据两个区间上最后一个位置的字符来进行分类讨论从而确定状态转移方程。 dp[i][j] 表示字符串 p 的 [0, j] 区间和字符串 s 的 [0, i] 区间是否可以匹配。 状态转移方程 根据最后一个位置的元素结合题目要求分情况讨论 当 p[j] 不是特殊字符且不与 s[i] 相等时无法匹配。当 s[i] p[j] 或 p[j] . 的时候此时两个字符串匹配上了当前的一个字符 只能从 dp[i - 1][j - 1] 中看当前字符前面的两个子串是否匹配。只能继承上个状态中的匹配结果 dp[i][j] dp[i - 1][j - 1] b. 当 p[j] * 的时候和力扣44. 通配符匹配稍有不同的是上道题 * 本身便可匹配 0 ~ n 个字符但此题是要带着 p[j - 1] 的字符⼀起匹配 0 ~ n 个和 p[j - 1] 相同的字符。此时匹配策略有两种选择 一种选择是 p[j - 1]* 匹配空字符串直接继承状态 dp[i][j - 2] 此时 dp[i][j] dp[i][j - 2] ;另一种选择是 p[j - 1]* 向前匹配 1 ~ n 个字符与力扣44. 通配符匹配不同此时p[j - 1]与s[i] 要相等 或者 p[j - 1] 为点直至匹配上整个 s 串。此时相当于从 dp[k][j - 2] (0 k i) 中所有匹配情况中选择性继承可以成功的情况。此时 dp[i][j] dp[k][j - 2] (0 k i 且 s[k]~s[i] p[j - 1]) ; 三种情况加起来就是所有可能的匹配结果。 综上所述状态转移方程为 当s[i] p[j] 或 p[j] . 时 dp[i][j] dp[i][j - 1] ;当 p[j] * 时有多种情况需要讨论 dp[i][j] dp[i][j - 2] ; dp[i][j] dp[k][j - 1] (0 k i) ; 这个状态转移方程时间复杂度为ON^3要想想优化。 优化当发现计算一个状态的时候需要一个循环才能搞定的时候我们要想到去优化。优化的方向就是用一个或者两个状态来表示这一堆的状态。通常就是把它写下来然后用数学的方式做一下等价替换 当 p[j] * 时状态转移方程为dp[i][j] dp[i][j - 2] || dp[i - 1][j - 2] || dp[i - 2][j - 2] ...... 发现 i 是有规律的减小的因此我们去看看 dp[i - 1][j] 列出 dp[i - 1][j] dp[i - 1][j - 1] || dp[i - 2][j - 1] || dp[i - 3][j - 1] ...... 然后就能发现 dp[i][j] 的状态转移方程里面除了第一项以外其余的都可以用dp[i -1][j] 替代。因此优化我们的状态转移方程为 dp[i][j] dp[i][j - 2] || dp[i - 1][j]。 初始化、填表顺序、返回值 初始化空串是有研究意义的因此我们将原始 dp 表的规模多加上一行和一列表示空串。由于 dp 数组的值设置为是否匹配为了不与答案值混淆我们需要将整个数组初始化为false 。由于需要用到前一行和前一列的状态初始化第一行、第一列即可。 dp[0][0] 表示两个空串能否匹配答案是显然的 初始化为 true 。 第一行表示 s 是一个空串 p 串和空串只有一种匹配可能即 p 串表示为 任一字符* 此时也相当于空串匹配上空串。所以可以遍历 p 串把所有前导为 任一字符* 的 p 子串和空串的 dp 值设为 true 。 第一列表示 p 是一个空串不可能匹配上 s 串跟随数组初始化成false即可。 填表顺序从上往下填写每一行每一行从左往右最后返回dp[m][n]。 class Solution { public:bool isMatch(string s, string p) {// dp[i][j]表示字符串p的[0, j]区间和字符串s的[0, i]区间是否可以匹配int m s.size(), n p.size();s s, p p;vectorvectorbool dp(m 1, vectorbool(n 1, false));dp[0][0] true;for(int j 2; j n; j 2){if(p[j] *)dp[0][j] true;elsebreak;}for(int i 1; i m; i){for(int j 1; j n; j){if(s[i] p[j] || p[j] .){dp[i][j] dp[i - 1][j - 1];}else if(p[j] *){ // j-1为点 或者 和s[i]相等才可以匹配dp[i - 1][j]if(p[j - 1] . || p[j - 1] s[i])dp[i][j] dp[i][j - 2] || dp[i - 1][j];else // 匹配空串的dp[i][j] dp[i][j - 2];}}}return dp[m][n];} };
http://www.hkea.cn/news/14459383/

相关文章:

  • 中国古建筑网站网页设计课程期末总结
  • 平安网站建设工作总结自建域名
  • 站长工具seo综合查询 正品蓝导航搭建个网站多少钱
  • 网站怎样优化seowordpress plugins权限
  • 三种常用的网站设计软件公司网站管理规定
  • 创建本地网站网站改版销售话术
  • 网站建设找业主签字模板企业邮箱查询
  • 谷歌seo网站建设泰安人才网app
  • 怎么建设一个淘宝客网站湖北建设执业注册管理中心网站
  • 一个具体网站的seo优化线上营销培训
  • flask做网站工具怎么在word添加wordpress
  • 网站建设目的意义软件开发工作
  • 网站平台设计费用西安市城乡建设管理局网站
  • 南昌网站建设在哪里wordpress运行php文件下载
  • 做网站php的作用社保代缴网站开发
  • 广东省网站备案系统宝安网站制作网站建设
  • 手机app制作网站丹东企业做网站
  • 自己如何免费制作一个网站网页怎么制作二维码
  • 网站建设行业数据我的网站模板下载
  • 怎么做网站排名天津站设计单位
  • 阿里巴巴国际站网页版刚做的网站怎么在百度上能搜到
  • 清苑网站建设郴州旅游
  • 网站建设微信商城多少钱苍南县网站集约化建设
  • 福州展示网站制作的公司合肥网站开发外包
  • 企业网站备案座机号wordpress acf 收费
  • 站长工具国产烟台网站制作培训
  • 做一家网站要多少钱2个小时学会网站建设
  • 个人想做企业网站备案甘肃嘉峪关建设局网站
  • 天津网站优化公司哪家专业新浪做网站
  • 网站建设需要工作计划邢台网站推广多少钱