No.010 Regular Expression Matching
时间:2022-04-29
本文章向大家介绍No.010 Regular Expression Matching,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
10. Regular Expression Matching
- Total Accepted: 89193
- Total Submissions: 395441
- Difficulty: Hard
Implement regular expression matching with support for '.'
and '*'
.
'.' Matches any single character.
'*' Matches zero or more of the preceding element.
The matching should cover the entire input string (not partial).
The function prototype should be:
bool isMatch(const char *s, const char *p)
Some examples:
isMatch("aa","a") → false
isMatch("aa","aa") → true
isMatch("aaa","aa") → false
isMatch("aa", "a*") → true
isMatch("aa", ".*") → true
isMatch("ab", ".*") → true
isMatch("aab", "c*a*b") → true
思路:
参考自:http://www.tuicool.com/articles/Ebiymu
- 首先要理解题意:
- "a"对应"a", 这种匹配不解释了
- 任意字母对应".", 这也是正则常见
- 0到多个相同字符x,对应"x*", 比起普通正则,这个地方多出来一个前缀x. x代表的是 相同的字符中取一个,比如"aaaab"对应是"a*b"
- "*"还有一个易于疏忽的地方就是它的"贪婪性"要有一个限度.比如"aaa"对应"a*a", 代码逻辑不能一路贪婪到底
- 正则表达式如果期望着一个字符一个字符的匹配,是非常不现实的.而"匹配"这个问题,非 常容易转换成"匹配了一部分",整个匹配不匹配,要看"剩下的匹配"情况.这就很好的把 一个大的问题转换成了规模较小的问题:递归
- 确定了递归以后,使用java来实现这个问题,会遇到很多和c不一样的地方,因为java对字符 的控制不像c语言指针那么灵活charAt一定要确定某个位置存在才可以使用.
- 如果pattern是"x*"类型的话,那么pattern每次要两个两个的减少.否则,就是一个一个 的减少. 无论怎样减少,都要保证pattern有那么多个.比如s.substring(n), 其中n 最大也就是s.length()
1 public boolean isMatch(String s, String p) {
2 // base case
3 if (p.length() == 0) {
4 return s.length() == 0;
5 }
6
7 // special case
8 if (p.length() == 1) {
9 // if the length of s is 0, return false
10 if (s.length() < 1) {
11 return false;
12 }
13 //if the first does not match, return false
14 else if ((p.charAt(0) != s.charAt(0)) && (p.charAt(0) != '.')) {
15 return false;
16 }
17
18 // otherwise, compare the rest of the string of s and p.
19 else {
20 return isMatch(s.substring(1), p.substring(1));
21 }
22 }
23
24 // case 1: when the second char of p is not '*'
25 if (p.charAt(1) != '*') {
26 if (s.length() < 1) {
27 return false;
28 }
29 if ((p.charAt(0) != s.charAt(0)) && (p.charAt(0) != '.')) {
30 return false;
31 } else {
32 return isMatch(s.substring(1), p.substring(1));
33 }
34 }
35
36 // case 2: when the second char of p is '*', complex case.
37 else {
38 //case 2.1: a char & '*' can stand for 0 element
39 if (isMatch(s, p.substring(2))) {
40 return true;
41 }
42
43 //case 2.2: a char & '*' can stand for 1 or more preceding element,
44 //so try every sub string
45 int i = 0;
46 while (i<s.length() && (s.charAt(i)==p.charAt(0) || p.charAt(0)=='.')){
47 if (isMatch(s.substring(i + 1), p.substring(2))) {
48 return true;
49 }
50 i++;
51 }
52 return false;
53 }
54 }
- 【Android基础】利用Intent在Activity之间传递数据
- 通过shell脚本监控日志切换频率 (94天)
- 【专业技术】Linux设备驱动第八篇:高级字符驱动操作之设备存取控制
- ORA-00439的解决(笔记93天)
- @Scheduled 注解的使用
- 生产系统调优之_毫秒级的改进 (92天)
- java获取视频文件的长度
- java注解示例程序
- mysqldb库安装与python交互操作
- 【答疑释惑】标准C语言如何操作文件?
- 回溯算法思想与八皇后问题解的个数
- 在spring中使用自定义注解注册监听器
- 在springBoot项目中使用activiti
- ORACLE dataguard学习笔记 (91天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- XtraBackup工具详解 Part 2 xtrabackup安装
- XtraBackup工具详解 Part 4 XtraBackup权限及配置
- XtraBackup工具详解 Part 5 使用innobackupex对数据库进行全备
- XtraBackup工具详解 Part 6 使用innobackupex对全备进行恢复
- [修正]XtraBackup工具详解 Part 6 使用innobackupex对全备进行恢复
- XtraBackup工具详解 Part 7 使用innobackupex对数据库进行增量备份
- XtraBackup工具详解 Part 8 使用innobackupex对增量备份进行恢复
- MySQL复制全解析 Part 2 一步步搭建基于二进制文件位置的MySQL复制
- MySQL复制全解析 Part 3 MySQL半同步复制设置
- MySQL 复制全解析 Part 4 使用备库搭建MySQL复制
- MySQL复制全解析 Part 5 MySQL GTID的格式和存储
- MySQL复制全解析 Part 6 MySQL GTID 生命周期
- MySQL复制全解析 Part 7 gtid_next和gtid_purged系统变量解析
- MySQL复制全解析 Part 8 GTID Auto-Positioning
- 红队之windows用户和组