题目:

请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配

分析:

我们先分析匹配时,模式中的字符的下一个是*的情况,此时还会分成两种情况,

  一种是当前字符串中的字符和模式中的字符相同,或者模式中的字符是‘.’,也就是a和a* 或者 a和.*,此时我们有三条策略继续匹配,

    一种是认为a后面可能还有a,也就是*代表多个字符,所以匹配字符串字符的下一个字符和当前模式的字符。

    一种是认为a已经可以和当前模式的字符匹配上了,也就是*认为是1个字符,所以匹配字符串字符的下一个字符和当前模式的字符的下两个(a*匹配成功)。

    或者是将*当成0个字符,所以匹配字符串的当前字符和当前模式的字符的下两个(a*和空字符匹配成功)。

    这三种情况的结果取或,因为有一种匹配成功,就算匹配了。b

  如果前字符串中的字符和模式中的字符不相同,也就是(a和b*)这种情况,那么就匹配字符串的当前字符和当前模式的字符的下两个(b*和空字符匹配成功)。

如果模式中的字符的下一个不是*,也会分两种情况。

  一种是当前字符串中的字符和模式中的字符相同或模式中的字符是‘.’,也就是a和a或a和.这种,我们可以直接去匹配字符串和模式字符串的下一个字符。

  另一种情况就是当前的字符是不同的,那么就直接返回错误即可。

注意java要时刻判断数组越界问题。

程序:

C++

class Solution {
public:
bool match(char* str, char* pattern)
{
if(*str == '\0' && *pattern == '\0')
return true;
if(*str != '\0' && *pattern == '\0')
return false;
if(*(pattern+1) == '*'){
//a a* || a .*
if(*str == *pattern || (*pattern == '.' && *str != '\0')){
return match(str+1, pattern) || match(str, pattern+2) || match(str+1, pattern+2);
}
//a b*
else{
return match(str, pattern+2);
}
}
else{
//a a || a .
if(*str == *pattern || (*pattern == '.' && *str != '\0')){
return match(str+1, pattern+1);
}
//a b
else{
return false;
} }
}
};

Java

public class Solution {
public boolean match(char[] str, char[] pattern)
{
if(str == null || pattern == null)
return false;
return matchHelper(str, pattern, 0, 0);
}
public static boolean matchHelper(char[] str, char[] pattern, int i, int j)
{
if(i == str.length && j == pattern.length)
return true;
if(i != str.length && j == pattern.length)
return false;
if(j+1 < pattern.length && pattern[j+1] == '*') {
if((i != str.length && pattern[j] == str[i]) || (pattern[j] == '.' && i != str.length)) {
return matchHelper(str, pattern, i+1, j) ||
matchHelper(str, pattern, i, j+2) ||
matchHelper(str, pattern, i+1, j+2);
}else {
return matchHelper(str, pattern, i, j+2);
}
}else {
if((i != str.length && pattern[j] == str[i]) || (pattern[j] == '.' && i != str.length)) {
return matchHelper(str, pattern, i+1, j+1);
}else {
return false;
}
}
}
}

剑指Offer-52.正则表达式匹配(C++/Java)的更多相关文章

  1. 剑指Offer 52. 正则表达式匹配 (字符串)

    题目描述 请实现一个函数用来匹配包括'.'和'*'的正则表达式.模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次). 在本题中,匹配是指字符串的所有字符匹配整个模式 ...

  2. [剑指Offer] 52.正则表达式匹配

    题目描述 请实现一个函数用来匹配包括'.'和'*'的正则表达式.模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次). 在本题中,匹配是指字符串的所有字符匹配整个模式 ...

  3. 剑指offer:正则表达式匹配

    目录 题目 解题思路 具体代码 题目 题目链接 剑指offer:正则表达式匹配 题目描述 请实现一个函数用来匹配包括'.'和'*'的正则表达式.模式中的字符.表示任意一个字符,而*表示它前面的字符可以 ...

  4. 剑指 Offer 19. 正则表达式匹配 + 动态规划

    剑指 Offer 19. 正则表达式匹配 题目链接 一. 字符串匹配大致可以分为三种情况: 第一种:正则串的最后一个字符为正常字符,此时根据主串的最后一个字符是否和它相同来判断是否匹配, 如果相同,则 ...

  5. 【Java】 剑指offer(19) 正则表达式匹配

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 请实现一个函数用来匹配包含'.'和'*'的正则表达式.模式中的字符 ...

  6. Go语言实现:【剑指offer】正则表达式匹配

    该题目来源于牛客网<剑指offer>专题. 请实现一个函数用来匹配包括 . 和 * 的正则表达式.模式中的字符.表示任意一个字符,而 * 表示它前面的字符可以出现任意次(包含0次). 在本 ...

  7. 剑指offer——21正则表达式匹配

    题目描述 请实现一个函数用来匹配包括'.'和'*'的正则表达式.模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次). 在本题中,匹配是指字符串的所有字符匹配整个模式 ...

  8. 剑指 Offer 19. 正则表达式匹配

    题目描述 请实现一个函数用来匹配包含'. '和'*'的正则表达式.模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(含0次).在本题中,匹配是指字符串的所有字符匹配整个模式. ...

  9. 剑指 Offer 52. 两个链表的第一个公共节点 + 链表 + 第一个公共结点 + 双指针

    剑指 Offer 52. 两个链表的第一个公共节点 Offer_52 题目详情 题解分析 可以使用两个指针 node1,node2 分别指向两个链表 headA,headB 的头结点,然后同时分别逐结 ...

  10. 力扣 - 剑指 Offer 52. 两个链表的第一个公共节点

    题目 剑指 Offer 52. 两个链表的第一个公共节点 思路1(栈) 若两个链表相遇,则从它开始相遇的地方到链表末尾应该都是相同的,那么我们可以将两个链表分别放入两个栈中,然后依次循环比较两个栈顶的 ...

随机推荐

  1. 推荐一波微软家的浏览器:EDGE

    前段时间英雄联盟(LOL)队伍 EDG 夺冠成为热门事件,上了各大热搜,即使大家不玩英雄联盟,相信也多多少少有听说相关信息吧! 今天我们的主角并不是 EDG,而是微软的新版浏览器 EDGE !!! 微 ...

  2. 使用ollama + AnythingLLM快速且简单的在本地部署llm3

    使用ollama + AnythingLLM快速且简单的在本地部署llm3 不多说,直接开始 一.安装ollama ollama官网:https://ollama.com/ 下载地址:https:// ...

  3. 力扣283(java)-移动零(简单)

    题目: 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序. 请注意 ,必须在不复制数组的情况下原地对数组进行操作. 示例 1: 输入: nums = [0, ...

  4. Pandas+ SLS SQL:融合灵活性和高性能的数据透视

    简介: Pandas是一个十分强大的python数据分析工具,也是各种数据建模的标准工具.Pandas擅长处理数字型数据和时间序列数据.Pandas的第一大优势在于,封装了一些复杂的代码实现过程,只需 ...

  5. WebAssembly + Dapr = 下一代云原生运行时?

    简介: 云计算已经成为了支撑数字经济发展的关键基础设施.云计算基础设施也在持续进化,从 IaaS,到容器即服务(CaaS),再到 Serverless 容器和函数 PaaS (fPaaS 或者 Faa ...

  6. 阿里云IoT Studio升级版新增解决方案引擎 大幅提升方案交付效率

    简介: 8月25日,阿里云发布IoT Studio升级版,新增了解决方案引擎,让设备方案商复用之前搭建的解决方案模板进行简单的定制化修改,即可交付.使整个物联网解决方案的交付过程由几个月,缩短到几小时 ...

  7. 5.prometheus监控--监控nginx

    1.监控程序环境准备 mkdir /data/docker-compose -p cd /data/docker-compose cat > docker-compose.yaml <&l ...

  8. ClickHouse常用Sql

    -- 删除字段 ALTER TABLE 表名 DROP COLUMN 字段名; -- 新增字段,和字段备注 ALTER TABLE 表名 ADD COLUMN IF NOT EXISTS 字段名 St ...

  9. Mybatis逆向工程的2种方法,一键高效快速生成Pojo、Mapper、XML,摆脱大量重复开发

    一.写在开头 最近一直在更新<Java成长计划>这个专栏,主要是Java全流程学习的一个记录,目前已经更新到Java并发多线程部分,后续会继续更新:而今天准备开设一个全新的专栏 <E ...

  10. 这几个好用的 Google 搜索技巧,让你飞起!

    搜索能力是被绝大多数人低估一项基本素质,绝大部分做编程技术相关的朋友应该都知道如何使用 Google,但是并不知道如何利用它的潜力.其实不管是 Google 还是 百度,会搜索的人一样都可以查找到需要 ...