Regular Expression Matching

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

 基本思路就是先看字符串s和p的从i和j开始的子串是否匹配,用递归的方法直到串的最后,最后回溯回来得到结果。假设现在走到s的i位置,p的j位置,情况分为下列两种: 
(1)p[j+1]不是'*'。情况比较简单,只要判断当前s的i和p的j上的字符是否一样(如果有p在j上的字符是'.',也是相同),如果不同,返回false,否则,递归下一层i+1,j+1; 
(2)p[j+1]是'*'。那么此时看从s[i]开始的子串,假设s[i],s[i+1],...s[i+k]都等于p[j]那么意味着这些都有可能是合适的匹配,那么递归对于剩下的(i,j+2),(i+1,j+2),...,(i+k,j+2)都要尝试(j+2是因为跳过当前和下一个'*'字符)。 
C++实现代码如下:

#include<iostream>
#include<string>
using namespace std;

class Solution {
public:
    bool isMatch(const char *s, const char *p) {
        return helper(string(s),string(p),0,0);
    }
    bool helper(const string s,const string p,size_t i,size_t j)
    {
        if(j==p.length())
            return i==s.length();
         //p.charAt(j+1)!='*'
        if(j==p.length()-1||p[j+1]!='*')
        {
            if(i==s.length()||(s[i]!=p[j]&&p[j]!='.'))
                return false;
            else
                return helper(s,p,i+1,j+1);
        }
        //p.charAt(j+1)=='*'
        while(i<s.length()&&(s[i]==p[j]||p[j]=='.'))
        {
            if(helper(s,p,i,j+2))
                return true;
            i++;
        }
        return helper(s,p,i,j+2);
    }
};

int main()
{
    Solution ss;
    const char *s="aa";
    const char *p=".*bbb";
    cout<<ss.isMatch(s,p)<<endl;
}

 

时间: 2024-08-26 11:13:35

Regular Expression Matching的相关文章

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

最近代码写的少了,而leetcode一直想做一个python,c/c++解题报告的专题,c/c++一直是我非常喜欢的,c语言编程练习的重要性体现在linux内核编程以及一些大公司算法上机的要求,python主要为了后序转型数据分析和机器学习,所以今天来做一个难度为hard 的简单正则表达式匹配. 做了很多leetcode题目,我们来总结一下套路: 首先一般是检查输入参数是否正确,然后是处理算法的特殊情况,之后就是实现逻辑,最后就是返回值. 当编程成为一种解决问题的习惯,我们就成为了一名纯粹的程序

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

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

[LeetCode]10.Regular Expression Matching

题目 mplement 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

java正则表达式; regular expression

express|正则 概要 文本处理经常涉及的根据一个pattern的匹配.尽管java的character和assorted 的String类提供了low-level的pattern-matching支持,这种支持一般带来了复杂的代码.为了帮助你书写简单的pattern-matching代码,java提供了regular expression.在介绍给你术语和java.util.regex包之后,Jeff Friesen explores 了许多那个包的Pattern类支持的正则表达式结构.然

REGULAR EXPRESSION IN VBSCRIPT

express|vbscript|express|vbscript   REGULAR EXPRESSION IN VBSCRIPTObject RegExp is used to create and execute regular expression Ex.Code:strTarget="test testing tested attest late start"Set objRegExp= New RegExp   'create a regular expression ob

用Regular Expression来改变HTML代码

express     我最近在为一个客户开发在线论坛程序,我想把用户发言中的url或e-mail地址用超链接显示出来. 用JavaScript的regular expressions是最容易实现的.      用户在表单里的多行文本框中输入他们的发言内容,然后把消息送到论坛的用户发言区中,然而,在把消息在论坛里显示出来之前,我要调用一个函数来处理消息,对url动些手脚.      我不想在这里讨论如何从数据库里取得一条记录了,这个站点已经说得很透彻了. 我们假设用户的消息文本存放在数据库中,并

正则表达式regular expression详述(一)

express|正则 正则表达式是regular expression,看来英文比中文要好理解多了,就是检查表达式符 不符合规定!!正则表达式有一个功能十分强大而又十分复杂的对象RegExp,在JavaScript1.2 版本以 上提供. 下面我们看看有关正则表达式的介绍: 正则表达式对象用来规范一个规范的表达式(也就是表达式符不符合特定的要求,比如是不是Email 地址格式等),它具有用来检查给出的字符串是否符合规则的属性和方法. 除此之外,你用RegExp构造器建立的个别正则表达式对象的属性

Regular Expression 正则表达式-1 (C#)

express|正则 起因是因为一片帖子,问到了一个问题,帖子是这样的: Originally Posted by 人就是这样我想编一个程序,但学CompSci是很久以前的事情了.想请教请教大家. 有两个txt文件,一个叫source.txt(有很多数据), 一个叫target.txt(空白的) 我想把source.txt里的一些数据提取出来(稍微修改一下),然后写到target.txt里面. 举个例子:sourse.txt里的数据:2oi)4@##( "data:001%abc"&g

&quot;proxy_pass&quot; cannot have URI part in location given by regular expression

在windows中使用nginx时报错: C:\TDDOWNLOAD\nginx-1.6.0\nginx-1.6.0>nginx.exe -s reload nginx: [emerg] "proxy_pass" cannot have URI part in location given by regular expression, or inside named location, or inside "if" statement, or insid e