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 }
- 使用Topshelf 5步创建Windows 服务
- TGM Plugin Activation:为WordPress 主题添加“插件推荐安装”功能
- [腾讯社区开放平台]介绍开放授权协议-OAuth
- HTML5规范的本地存储
- ASP.NET Web API 处理架构
- ASP.NET MVC 4中的单页面应用程序
- [信息安全] 4.一次性密码 && 身份认证三要素
- 拥抱大数据时代
- 腾讯社区开放平台.NET SDK在Mono下运行
- Redis Web界面管理工具
- [信息安全] 3.HTTPS工作流程
- 初探css3
- QQ互联OAuth2.0 .NET SDK 发布以及网站QQ登陆示例代码
- 如何找出被黑客攻击后篡改的WordPress 文件?
- 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 数组属性和方法
- C# 生成chart图表的三种方式
- C# Task.Run调用外部参数
- Git全方位指南,即用即查就可
- Python入门教程笔记(二)控制语句
- Python入门教程笔记(一)简介、变量及基本数据类型
- C#知识点讲解之C#delegate、event、Action、EventHandler的使用和区别
- typescript高级用法之infer的理解与使用
- 基于业务场景下的图片/文件上传方案总结
- LeetCode96|二叉搜索树中的搜索
- LeetCode95|字符串中的第一个唯一字符
- LeetCode94|Pow(x,n)
- LeetCode93|数值的整数次方
- LeetCode92|排序数组
- 缓存 | 从本地缓存到分布式缓存, Guava, Caffeine, Memcached, Redis
- WebView三问—B站真题