剑指offer(52)正则表达式的匹配
题目描述
请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配
题目分析
说实话这道题有点像编译原理中的状态机,我们做的时候可以结合 画图 来做。
第一种方法是我们比较容易想到的就是用js的原生方法,这个比较简单,不过这题显然是考我们如何去实现原生的方法,也就是第二种方法。
第二种方法说实话还是比较难的,因为情况比较复杂,需要理清思路。不过首先我们想到的是这题肯定需要用递归,也就是关键就是如何写这个递归函数,以及需要哪些参数!
理清思路:
当模式中的第二个字符不是“*”时
1.如果字符串中的第一个字符和模式中的第一个字符相匹配,那么在字符串和模式上都向后移动一个字符,然后匹配剩余的字符串和模式。
2.如果字符串中的第一个字符和模式中的第一个字符不相匹配,则直接返回false。
当模式中第二个字符是“*”时,有多种不同匹配方式。
1.在模式上上向后移动两个字符,相当于x*被忽略。因为“*”可以匹配字符串中的0个字符。
2.如果模式中第一个字符和字符串中的第一个字符相匹配,则在字符串上向后移动一个字符。
这种情况下可以有两种选择:
a.模式上向后移动两个字符
b.模式保持不变
对于JS语言来说,我们的递归函数除了字符串和模式外,还需要两个额外参数来记录下当前在字符串和模式上移动的位置索引。
代码
第一种方法:
// 第一种
function match(s, pattern) {
const reg = new RegExp(`^${pattern}$`);
return reg.test(s);
}
第二种方法:
// 第二种
function matchCore(s, istr, pattern, ipattern) {
if (istr === s.length && ipattern === pattern.length) {
return true;
} if (istr !== s.length && ipattern === pattern.length) {
return false;
}
if (pattern[ipattern + 1] === '*') {
if (pattern[ipattern] === '.' && istr !== s.length || pattern[ipattern] === s[istr]) {
return (
matchCore(s, istr + 1, pattern, ipattern + 2) ||
matchCore(s, istr + 1, pattern, ipattern) ||
matchCore(s, istr, pattern, ipattern + 2)
);
}
return matchCore(s, istr, pattern, ipattern + 2);
} if (s[istr] === pattern[ipattern] || pattern[ipattern] === '.' && istr !== s.length) {
return matchCore(s, istr + 1, pattern, ipattern + 1);
}
return false;
} function match2(s, pattern) {
if (s === null || pattern === null) {
return false;
}
return matchCore(s, 0, pattern, 0);
}
剑指offer(52)正则表达式的匹配的更多相关文章
- 剑指Offer 52. 正则表达式匹配 (字符串)
		题目描述 请实现一个函数用来匹配包括'.'和'*'的正则表达式.模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次). 在本题中,匹配是指字符串的所有字符匹配整个模式 ... 
- [剑指Offer] 52.正则表达式匹配
		题目描述 请实现一个函数用来匹配包括'.'和'*'的正则表达式.模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次). 在本题中,匹配是指字符串的所有字符匹配整个模式 ... 
- 剑指offer:正则表达式匹配
		目录 题目 解题思路 具体代码 题目 题目链接 剑指offer:正则表达式匹配 题目描述 请实现一个函数用来匹配包括'.'和'*'的正则表达式.模式中的字符.表示任意一个字符,而*表示它前面的字符可以 ... 
- 剑指 Offer 19. 正则表达式匹配 + 动态规划
		剑指 Offer 19. 正则表达式匹配 题目链接 一. 字符串匹配大致可以分为三种情况: 第一种:正则串的最后一个字符为正常字符,此时根据主串的最后一个字符是否和它相同来判断是否匹配, 如果相同,则 ... 
- 剑指 Offer 52. 两个链表的第一个公共节点 + 链表 + 第一个公共结点 + 双指针
		剑指 Offer 52. 两个链表的第一个公共节点 Offer_52 题目详情 题解分析 可以使用两个指针 node1,node2 分别指向两个链表 headA,headB 的头结点,然后同时分别逐结 ... 
- 力扣 - 剑指 Offer 52. 两个链表的第一个公共节点
		题目 剑指 Offer 52. 两个链表的第一个公共节点 思路1(栈) 若两个链表相遇,则从它开始相遇的地方到链表末尾应该都是相同的,那么我们可以将两个链表分别放入两个栈中,然后依次循环比较两个栈顶的 ... 
- 【Java】 剑指offer(19) 正则表达式匹配
		本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 请实现一个函数用来匹配包含'.'和'*'的正则表达式.模式中的字符 ... 
- Go语言实现:【剑指offer】正则表达式匹配
		该题目来源于牛客网<剑指offer>专题. 请实现一个函数用来匹配包括 . 和 * 的正则表达式.模式中的字符.表示任意一个字符,而 * 表示它前面的字符可以出现任意次(包含0次). 在本 ... 
- 【Java】 剑指offer(52) 两个链表的第一个公共结点
		本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 输入两个链表,找出它们的第一个公共结点. 思路 蛮力法:遍历第一个 ... 
- 剑指offer——21正则表达式匹配
		题目描述 请实现一个函数用来匹配包括'.'和'*'的正则表达式.模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次). 在本题中,匹配是指字符串的所有字符匹配整个模式 ... 
随机推荐
- web.py框架之基本应用
			一.基本应用 1.1 Hello World! # coding:utf-8 import web urls = ( "/.*", "Tk_online" ) ... 
- TemplateBuilder Android Studio
			TemplateBuilder:是Android Studio的一个开发模板,大大提高开发效率. 
- 11 vs2015 连接oracle 11g 数据库及相关问题
			1.下载Oracle Developer Tools for Visual Studio 2015 ,网址如下. http://www.oracle.com/technetwork/topics/do ... 
- react纯手写全选与取消全选
			<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ... 
- php 命令行参数
			getopt (PHP 4 >= 4.3.0, PHP 5, PHP 7) getopt — 从命令行参数列表中获取选项 说明 array getopt ( string $options [, ... 
- bugfree3.0.1-BUG解决方案修改
			该篇内容来自文档“masterBugFree2.pdf”,记录在这里. 1.如何将解决方案改为中文 在\Bugfree\Lang\ZH_CN_UTF-8 \_COMMON.php 文件中做如下修改/* ... 
- 流控制、FlowControl
			这个选项基本上所有网卡都会有,但是叫法会有些差别,比如Realtek网卡叫做流控制,Intel网卡叫做流程控制,还有一些网卡选项干脆是英文的,叫做FlowControl,很多交换机上也有这个功能,也叫 ... 
- expdp 字符集从ZHS16GBK到AL32UTF8
			源oracle数据库是GBK字符集,目标库是UTF8字符集,现在需要将源库的一个表空间数据导入到目标库.我的解决方法有点繁琐,首先直接导出源库的表空间 expdp trmuser/trmpass sc ... 
- Python:遍历一个目录下所有的文件及文件夹,然后计算每个文件的字符和line的小程序
			编写了一个遍历一个目录下所有的文件及文件夹,然后计算每个文件的字符和line的小程序,先把程序贴出来. #coding=utf-8 ''' Created on 2014年7月14日 @author: ... 
- 蓝桥杯近三年初赛题之一(15年b组)
			临近比赛,自己定时做了近三年的初赛题,不是很理想,10道题平均做对5+道.为了这次比赛,总共做了200题左右吧,估计去北京参加决赛有点难,不过不管怎样,对得起自己万余行代码就好. 一.15年初赛题(第 ... 
