剑指Offer-52.正则表达式匹配(C++/Java)
题目:
请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含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)的更多相关文章
- 剑指Offer 52. 正则表达式匹配 (字符串)
题目描述 请实现一个函数用来匹配包括'.'和'*'的正则表达式.模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次). 在本题中,匹配是指字符串的所有字符匹配整个模式 ...
- [剑指Offer] 52.正则表达式匹配
题目描述 请实现一个函数用来匹配包括'.'和'*'的正则表达式.模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次). 在本题中,匹配是指字符串的所有字符匹配整个模式 ...
- 剑指offer:正则表达式匹配
目录 题目 解题思路 具体代码 题目 题目链接 剑指offer:正则表达式匹配 题目描述 请实现一个函数用来匹配包括'.'和'*'的正则表达式.模式中的字符.表示任意一个字符,而*表示它前面的字符可以 ...
- 剑指 Offer 19. 正则表达式匹配 + 动态规划
剑指 Offer 19. 正则表达式匹配 题目链接 一. 字符串匹配大致可以分为三种情况: 第一种:正则串的最后一个字符为正常字符,此时根据主串的最后一个字符是否和它相同来判断是否匹配, 如果相同,则 ...
- 【Java】 剑指offer(19) 正则表达式匹配
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 请实现一个函数用来匹配包含'.'和'*'的正则表达式.模式中的字符 ...
- Go语言实现:【剑指offer】正则表达式匹配
该题目来源于牛客网<剑指offer>专题. 请实现一个函数用来匹配包括 . 和 * 的正则表达式.模式中的字符.表示任意一个字符,而 * 表示它前面的字符可以出现任意次(包含0次). 在本 ...
- 剑指offer——21正则表达式匹配
题目描述 请实现一个函数用来匹配包括'.'和'*'的正则表达式.模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次). 在本题中,匹配是指字符串的所有字符匹配整个模式 ...
- 剑指 Offer 19. 正则表达式匹配
题目描述 请实现一个函数用来匹配包含'. '和'*'的正则表达式.模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(含0次).在本题中,匹配是指字符串的所有字符匹配整个模式. ...
- 剑指 Offer 52. 两个链表的第一个公共节点 + 链表 + 第一个公共结点 + 双指针
剑指 Offer 52. 两个链表的第一个公共节点 Offer_52 题目详情 题解分析 可以使用两个指针 node1,node2 分别指向两个链表 headA,headB 的头结点,然后同时分别逐结 ...
- 力扣 - 剑指 Offer 52. 两个链表的第一个公共节点
题目 剑指 Offer 52. 两个链表的第一个公共节点 思路1(栈) 若两个链表相遇,则从它开始相遇的地方到链表末尾应该都是相同的,那么我们可以将两个链表分别放入两个栈中,然后依次循环比较两个栈顶的 ...
随机推荐
- 力扣628(java)-三个数的最大乘积(简单)
题目: 给你一个整型数组 nums ,在数组中找出由三个数组成的最大乘积,并输出这个乘积. 示例 1: 输入:nums = [1,2,3]输出:6示例 2: 输入:nums = [1,2,3,4]输出 ...
- Beetl 源码解析:GroupTemplate 类
本文首发于公众号:腐烂的橘子 前言 Beetl 是一款 Java 模板引擎,在公司的项目中大量运用,它的作用是写通用代码时,有一些差异化的逻辑需要处理,这时可以把这些差异化的逻辑写在模板里,程序直接调 ...
- [FE] uni-app Card 卡片组件 uni-card 用法
使用 uni-card 和其它组件没有什么区别,关注支持的属性和事件即可. 对于属性,需要特别注意值的类型,比如不要把非字符串的当做字符串处理. 举例,如下 is-full 需要 Boolean 类型 ...
- 02 Orcad设计环境讲解与工程创建
02 Orcad设计环境讲解与工程创建 学习目标: 1) 掌握Orcad软件绘制元件库以及原理图的方法: 2) 掌握Allegro软件绘制PCB库以及PCB的方法: 3) 掌握Orca ...
- 一键接入大模型:One-Api本地安装配置实操
前言 最近准备学习一下 Semantic Kernel, OpenAI 的 Api 申请麻烦,所以想通过 One-api 对接一下国内的在线大模型,先熟悉一下 Semantic Kernel 的基本用 ...
- 国外anonfiles网盘大文件下载器
各位注意了,这个网站很久以前是可以国内直接访问的,后来被墙了,但仍然可以使用代理下载,现如今,6天前大概2023年8月10号左右这个网站已经挂了,就是彻底不能用了,所有与之有关的东西比如网页,都是假的 ...
- ansible系列(25)--ansible的notify和handlers
1. notify和handlers Handlers 是一个触发器,同时是一个特殊的 tasks ,它无法直接运行,它需要被tasks 通知后才会运行.比如: httpd 服务配置文件发生变更,我们 ...
- WordPress 整合Bootstrap制作分页代码
1.整合Bootstrap分页代码 * 因为wordpress默认仅仅提供简单分页, 所以要实现数字分页,需要自定义函数,wordpress可以结合bootstrap制作分页,bootstrap提供了 ...
- IDEA连接github
在IDEA中添加github账号: File-->Settings-->Version Control-->GitHub 点击 + 号,添加账号可以选择账号密码登陆或者使用token ...
- mac本地搭建ollama
mac本地搭建ollama webUI *简介:ollama-webUI是一个开源项目,简化了安装部署过程,并能直接管理各种大型语言模型(LLM).本文将介绍如何在你的macOS上安装Ollama服务 ...