leetcode 10、Regular Expression Matching

本题大意: 给你一个字符串s, 以一个模式串p,而模式串中规则匹配的只有 '.' 和 ‘*’,其中 ‘.’ 代表匹配任意一个字符,‘*’ 代表匹配的前一个字符有0个或多个,求字符串s和模式串p是否匹配?

题解:本题利用递归的思想使用模式串p去匹配字符串s;

1、当p为空的时候,s为空返回true,否则返回false

2、当p只有一个字符时,s 中的字符是否为1并且 (s[0] == p[0] or p[0] == '.');

3、当p[1] != '*'时, 判断s是否为空,是返回false, 否则返回(s[0] == p[0] or p[0] == '.') && isMatch(s.substr(1), p.substr(1))

      substr(start) 表示截取从字符串start的位置到字符串的末尾

4、当p[1] == '*'时, 判断s是否为空 并且 (s[0] == p[0] or p[0] == '.'); 当s和p.substr(2)匹配时直接返回true(由于*可以匹配的前一个字符可以是0个,所以如果s和p.substr(2)匹配,前面的可以认为是0个,是符合模式匹配串的),如果不匹配则s = s.substr(1)

5、返回isMatch(s, p.substr(2))

 

#include <iostream>
using namespace std;

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 = "ab";
    string p = "a*";
    cout << isMatch(s, p) << endl;
}

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值