10. 正则表达式匹配

/*给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.‘ 和 ‘*‘ 的正则表达式匹配。
‘.‘ 匹配任意单个字符
‘*‘ 匹配零个或多个前面的那一个元素
所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。
说明 :
s 可能为空,且只包含从 a - z 的小写字母。
p 可能为空,且只包含从 a - z 的小写字母,以及字符 .和 *。
示例 1 :
输入 :
   s = "aa"
   p = "a"
输出 : false
 解释 : "a" 无法匹配 "aa" 整个字符串。
	  示例 2 :
  输入 :
	 s = "aa"
	 p = "a*"
 输出 : true
  解释 : 因为 ‘*‘ 代表可以匹配零个或多个前面的那一个元素, 在这里前面的元素就是 ‘a‘。因此,字符串 "aa" 可被视为 ‘a‘ 重复了一次。
   示例 3 :
输入 :
	s = "ab"
	p = ".*"
输出 : true
 解释 : ".*" 表示可匹配零个或多个(‘*‘)任意字符(‘.‘)。
	  示例 4 :
  输入 :
	 s = "aab"
	 p = "c*a*b"
 输出 : true
  解释 : 因为 ‘*‘ 表示零个或多个,这里 ‘c‘ 为 0 个, ‘a‘ 被重复一次。因此可以匹配字符串 "aab"。
	   示例 5 :
   输入 :
	  s = "mississippi"
	  p = "mis*is*p*."
  输出 : false
  */

/*
解题思路:
1.若p为空,若s也为空,返回 true,反之返回 false。
2.若p的长度为1,若s长度也为1,且相同或是p为 ‘.‘ 则返回 true,反之返回 false。
3.若p的第二个字符不为*,若此时s为空返回 false,否则判断首字符是否匹配,
且从各自的第二个字符开始调用递归函数匹配。
4.若p的第二个字符为*,进行下列循环,条件是若s不为空且首字符匹配(包括 p[0] 为点),
调用递归函数匹配s和去掉前两个字符的p(这样做的原因是假设此时的星号的作用是让前面的字符出现0次,验证是否匹配)
,若匹配返回 true,否则s去掉首字母(因为此时首字母匹配了,我们可以去掉s的首字母,而p由于星号的作用,
可以有任意个首字母,所以不需要去掉),继续进行循环。
5.返回调用递归函数匹配s和去掉前两个字符的p的结果(
这么做的原因是处理星号无法匹配的内容,比如 s = "ab", p = "a*b",直接进入 while 循环后,
我们发现 "ab" 和 "b" 不匹配,所以s变成 "b",那么此时跳出循环后,
就到最后的 return 来比较 "b" 和 "b" 了,返回 true。再举个例子,
比如 s = "", p = "a*",由于s为空,不会进入任何的 if 和 while,
只能到最后的 return 来比较了,返回 true,正确)。
*/

#include<iostream>
#include<string>
using namespace std;
class Solution
{
public:
	bool isMatch(string s, string p)
	{
		if (p.empty())
			return s.empty();
		if (p.size() == 1) {
			return (s.size() == 1 && (s[0] == p[0] || p[0] == ‘.‘));
		}
		if (p[1] != ‘*‘)
		{
			if (s.empty())
				return false;
			return (s[0] == p[0] || p[0] == ‘.‘) && isMatch(s.substr(1), p.substr(1));
		}
		while (!s.empty() && (s[0] == p[0] || p[0] == ‘.‘))
		{
			if (isMatch(s, p.substr(2)))
				return true;
			s = s.substr(1);
		}
		return isMatch(s, p.substr(2));
	}
};
int main()
{

	string s;
	string p;
	cin >> s;
	cin >> p;
	cout << Solution().isMatch(s,p) << endl;
	system("pause");
	return 0;

}

  

原文地址:https://www.cnblogs.com/277223178dudu/p/11391908.html

时间: 2024-11-09 23:49:32

10. 正则表达式匹配的相关文章

LeetCode(10. 正则表达式匹配)

问题描述 给定一个字符串 (s) 和一个字符模式 (p).实现支持 '.' 和 '*' 的正则表达式匹配. '.' 匹配任意单个字符. '*' 匹配零个或多个前面的元素. 匹配应该覆盖整个字符串 (s) ,而不是部分字符串. 说明: s 可能为空,且只包含从 a-z 的小写字母. p 可能为空,且只包含从 a-z 的小写字母,以及字符 . 和 *. 示例 1: 输入: s = "aa" p = "a" 输出: false 解释: "a" 无法匹配

leetcode新年病房暴乱康复计划 10.正则表达式匹配 DP

/** * @param {string} s * @param {string} p * @return {boolean} */ var isMatch = function(s, p) { let dp = []; let len = s.length; let _len = p.length; for(let i = 0; i <= len; i++){ dp.push([]); dp[i][0] = 0; } dp[0][0] = 1; for(let i = 0; i <= _le

LeetCode 10 Regular Expression Matching (正则表达式匹配)

翻译 实现支持"."和"*"的正则表达式匹配. "." 匹配支持单个字符 "*" 匹配零个或多个前面的元素 匹配应该覆盖到整个输入的字符串(而不是局部的). 该函数的原型应该是: bool isMatch(const char * s, const char * p) 示例: isMatch("aa","a") → false isMatch("aa","a

PHP 正则表达式匹配 img ,PHP 正则提取或替换图片 img 标记中的任意属性。

PHP正则提取或替换img标记属性 PHP 正则表达式匹配 img ,PHP 正则提取或替换图片 img 标记中的任意属性. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 <?php /*PHP正则提取图片img标记中的任意属性*/ $str = '<center><img src="/uploads/images/20100516000.jpg"

【PYTHON】对整个文件进行正则表达式匹配

1 #coding:utf-8 2 import re 3 def IDXtoSCS(path):#IDX转换为开思的函数 4 IDXfile=open(path,'r') 5 fileread=IDXfile.readlines() 6 IDXfile.close() 7 p='"(\w)*",\s+(\d+\\.\d+),\s+(\d+\\.\d+),\s+(\d+\\.\d+),\s+"(\w*)",' 8 data=re.findall(p,fileread

Flex的正则表达式匹配速度与手工代码的比较

flex是一个词法分析器生成器,它是编译器和解释器编程人员的常用工具之一.flex的程序主要由一系列带有指令(称为动作代码)的正则表达式组成.在匹配输入时,flex会将所有的正则表达式翻译成确定性有穷自动机,这使得flex等词法分析器生成器生成的词法分析器匹配输入模式的效率非常高.当然,有人指责flex不够灵活,功能有限,很多问题都无法解决,比如Javascript.C++等语言中二义性的问题,实际上很多程序(比如Python的解释器)的词法分析器都是用的手工代码而不是flex自动生成的.这些都

正则表达式匹配日期时间

正则表达式 (?n:^(?=\d)((?<day>31(?!(.0?[2469]|11))|30(?!.0?2)|29(?(.0?2)(?=.{3,4}(1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|(16|[2468][048]|[3579][26])00))|0?[1-9]|1\d|2[0-8])(?<sep>[/.-])(?<month>0?[1-9]|1[012])\2(?<year>(1[6-9]|[

正则表达式匹配身份证 电话号码 邮箱 住宅电话 邮编等

身份证号码的匹配 大陆的居民身份证号码有两种:18位和15位,15位的身份证号码是老一代身份证号码. 18位和15位的区别在于两个部分:第一,18位号码的年份以4位计而15位号码的年份为2位,如1987年在18位号码中为'1987'而在15位号码中为'87',这里1987只是作为一个例子可能1987年及以后根本不存在15位号码:第二处不同在于18位号码的最后一位为数字校验码,15位号码没有数字校验位. 好吧,可能你还不知道身份证号码各个部分代表着什么,那么让我简略地介绍一下. 身份证号码总共有4

正则表达式 匹配罗马数字 并且返回匹配到的值

这两天楼主处理一个需求 要在很多字符串里面匹配出字符串中的罗马数字 还要取出这些罗马数字进行一系列的操作.在度娘上找了半天也没找到有用信息 还被很多错误的代码误导了 非常痛苦.好在最后各种努力 花了半天时间达到了想要的结果.现在在这里记录并分享一下.如果需要转载 请注明出处 写好传送门.thanks 这里分享一个网站 可以把阿拉伯数字转化为对应的罗马数字 没有上限 好用点赞加分享 http://www.zhongguosou.com/education_graduate_course_tools