Question

Given an input string (s) and a pattern (p), 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).

Note:

  s could be empty and contains only lowercase letters a-z.

  p could be empty and contains only lowercase letters a-z, and characters like . or *.

Example 1:

Input:
s = "aa"
p = "a"
Output: false
Explanation: "a" does not match the entire string "aa".

Example 2:

Input:
s = "aa"
p = "a*"
Output: true
Explanation: '*' means zero or more of the precedeng element, 'a'. Therefore, by repeating 'a' once, it becomes "aa".

Example 3:

Input:
s = "ab"
p = ".*"
Output: true
Explanation: ".*" means "zero or more (*) of any character (.)".

Example 4:

Input:
s = "aab"
p = "c*a*b"
Output: true
Explanation: c can be repeated 0 times, a can be repeated 1 time. Therefore it matches "aab".

Example 5:

Input:
s = "mississippi"
p = "mis*is*p*."
Output: false

Answer

  题意很容易明白,根据pattern判断string是否有效,就是说string是否符合pattern模式。

  string中的每个字符从a-z中选择,string可以为空。

  pattern由任意数量的a-z字母、’ . ' 以及 a*、b*到 z* 、. * 组成的字符串。

  (字符+星号*)表示有任意(包括零个)个字符,如a*表示有任意多个a,.* 表示有任意个字符。

  比如

Input:
s = "aa" p = "a"

我们根据p逐字匹配,s第一个字符与p第一个字符匹配,然而p没有第二个字符了,s还有一个a,就是s不与p匹配,所以输出false;

Input:
s = "mississippi"
p = "mis*is*p*."
Output: false

  和第一个例子一样,p的前两个字符和s匹配,p第三个字符加*表示有任意数量的s,这里匹配到s的第四个字符,接着s第五到第七个字符(iss)也与p相匹配,然后s的第八个字符i并没有在p中有所匹配,所以也输出false;

  根据上面的例子,我们可以开始考虑解决我们的问题了。

  首先,如果不考虑p中(字符+*)的组合,问题会特别简单,我们只需将p与s中的字符一一匹配即可。

  然而,如果有(字符+*)的存在,问题就有些复杂了。比如

Input:
s = "aab"

  你会发现

p = "a*ab" 或 p = "a*b" 或 p = "a*.b"

  都与s匹配。换句话说你不知道a*能匹配到多少个a,你不知道什么时候a*才算结束,比如说p = "a*ab"中a*对应s一个a,p="a*b"对应s两个a,p="a*.b"对应s一个a。最初我以为自己能根据a*后的字符判断a*与多少个a匹配,最后觉得思维有点乱便放弃了,主要原因是a*与多少个a匹配都有可能,比如p='a*b',若a*只与一个a匹配,后面就可能匹配不上了。

  所以,我们不妨将a*所有情况都考虑。逐个字符匹配时,若遇到类似a*这类型的两个字符时,我们分别考虑以下两种情况:

  ① a*与0个a匹配。

  ② a*与1个a匹配,然后p还是以a*与s的下一个字符匹配(就是说下次匹配继续考虑①②这两种情况)。

  这样就能考虑到a*的所有情况了。

Input:
s = "aab"
p = "c*a*b"
Output: true
Explanation: c can be repeated 0 times, a can be repeated 1 time. Therefore it matches "aab".

  然后根据以上算法我们编写代码:

    bool isMatch(string s, string p) {
int s_len = s.length();
int p_len = p.length();
if (p_len == )
return s_len == ;
bool match = (s_len != ) && (s[] == p[] || p[] == '.');
if (p_len >= && p[] == '*')
{
return isMatch(s, p.substr()) || (match && isMatch(s.substr(), p));
}
else if (p_len >= )
{
return match && isMatch(s.substr(), p.substr());
}
}

  代码思路时很清晰的,match判断下一个字符是否匹配,if (p_len >= 2 && p[1] == '*') 对 是否出现类似a*的情况 进行判断,若出现就像上面说的两种情况进行操作,若没有出现则一一匹配。

  最后要注意一下边界,特别是s为空,p为非空这两种情况。

  p为空,s为非空已经能说不匹配了; p,s都为空,说明匹配成功。

  p为非空,s为非空说明还能继续匹配,因为每次调用函数都是缩小字符串长度的。

  s为空,p为非空,有可能是p中出现类似a*的情况,也有可能p还剩a-z或'.'字符,也有可能是这两种组合。

  如果是p中形如a*正在匹配,我们从p中去掉它,因为相当于没有a。

  如果是后一种情况正在匹配,则匹配失败。

												

Leetcode Week1 Regular Expression Matching的更多相关文章

  1. leetcode 10 Regular Expression Matching(简单正则表达式匹配)

    最近代码写的少了,而leetcode一直想做一个python,c/c++解题报告的专题,c/c++一直是我非常喜欢的,c语言编程练习的重要性体现在linux内核编程以及一些大公司算法上机的要求,pyt ...

  2. LeetCode (10): Regular Expression Matching [HARD]

    https://leetcode.com/problems/regular-expression-matching/ [描述] Implement regular expression matchin ...

  3. [LeetCode][Python]Regular Expression Matching

    # -*- coding: utf8 -*-'''https://oj.leetcode.com/problems/regular-expression-matching/ Implement reg ...

  4. [LeetCode] 10. Regular Expression Matching 正则表达式匹配

    Given an input string (s) and a pattern (p), implement regular expression matching with support for  ...

  5. Leetcode 10. Regular Expression Matching(递归,dp)

    10. Regular Expression Matching Hard Given an input string (s) and a pattern (p), implement regular ...

  6. [LeetCode] 10. Regular Expression Matching

    Implement regular expression matching with support for '.' and '*'. DP: public class Solution { publ ...

  7. 【leetcode】Regular Expression Matching

    Regular Expression Matching Implement regular expression matching with support for '.' and '*'. '.' ...

  8. 【leetcode】Regular Expression Matching (hard) ★

    Implement regular expression matching with support for '.' and '*'. '.' Matches any single character ...

  9. 【JAVA、C++】LeetCode 010 Regular Expression Matching

    Implement regular expression matching with support for '.' and '*'. '.' Matches any single character ...

随机推荐

  1. JS求1到100的累计值

    sum=0 for(i=1;i<=100;i++) { sum+=i } alert(sum)   作者:kerwin-chyl 文章链接:https:////www.cnblogs.com/k ...

  2. Verilog HDL学习_1:分频器/PWM的实现

    (一)参考学习资料 (二)实际操作 1. 相关变量计算:   First Initial Second Initial Upper case H X ASCII (Dec) 72 88 Lengths ...

  3. Android中点击按钮获取星级评分条的评分

    场景 效果 注: 博客: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程序猿 获取编程相关电子书.教程推送与免费下载. 实现 将布局改为Lin ...

  4. CentOS6 用yum安装mysql详解,简单实用

    一.查看CentOS下是否已安装mysql 输入命令 :yum list installed | grep mysql 二.删除已安装mysql 输入命令: yum -y remove mysql 如 ...

  5. Oracle查询如何才能行转列?-sunziren

    原创文章,转载务必注明出处. 今天工作的时候,碰到一个问题,涉及oracle行转列,用了半小时解决,因此在这里写个博客记录一下解决办法. 原数据库表的数据是: 想要达到的效果是: 经过思考,这是一个o ...

  6. Bootstrap 手机屏幕自适应的响应式布局开关

    head中添加 <meta name="viewport" content="width=device-width, initial-scale=1, shrink ...

  7. Python 静态类型检查 mypy 示例

    以下所有例子都参考了最新版本的 Python 文档与 mypy 文档 必备条件 安装最新版本的 Python 和 mypy 要学会按需配置自己的编辑器,比如我的 VSCode 就装好了 Python ...

  8. .Net Core通过json文件 配置管理后台导航菜单

    先来看个最终效果图 以前我们配置后台菜单 一般都是把菜单链接, 图标, 以及层级关系 配置到数据库,Core很容易通过json文件来配置导航菜单  而不用存数据库了 先添加个menuconfig.js ...

  9. MyBatis中foreach循环的用法

    一.在了解foreach之前,先了解一下mybatis传入参数及parameterType 1.我们在Dao层向对应的mapper.xml文件传递参数时,可以传递的参数有: ①.基本数据类型(如int ...

  10. python数据类型(第一弹)

    作为一门计算机编程语言,python与其它语言一样,设有若干种数据类型,准确掌握各种数据类型的常用方法是精通python的必要条件,也是熟练使用各数据类型.最大限度发挥它们功能的基本条件. pytho ...