剑指offer_正则表达式的匹配(C++递归+所有输入情况分析)

原题链接

在这里插入图片描述

文章目录

思路

这个题主要是要充分考虑所有的可能情况,并且分析出每种情况递归的方式

情况一
a ab×

对于上面a ab×来讲:
第一个字符串结束后第二个字符串没有结束,但这仍然是符合的。因为×前的字符可以出现任意次(包括0次)当b出现0次与第一个字符串匹配了
但是如果第一个字符串没有结束,第二个字符串结束了,一定不符合要求。

情况二
a a.根据题意,这两个字符串不匹配
因为.可以表示任意字符,但是一定有字符,所以这种情况不匹配

情况三
“” “”
两个串为空串,此时算作匹配的情况


由上面的三种情况可知(原串设为str 正则表达式串设为pattern)

我们用两个指针来分别指向两个串的起点,当两个指针都指向对应的尾时说明匹配成功。由上面分析可知pattern为空str不为空时一定没有匹配成功。但是str为空pattern不为空时不能确定是否匹配成功,所以在下面的代码中要注意判断str是否为空

如果pattern出现×时×前的字符很重要
1.pattern中×前的字符与str字符相同时
①ab a×b
此时str指针+1,pattern指针+2跳过×。此时两个指针都指向字符b

②aab a×b
×前字符可以出现任意次,pattern中a要出现两次
str指针+1,pattern指针不动

③aa a×aa
这时×前的a要出现0次
str指针不动,pattern指针+2

这三种情况为或的关系,因为只要有一种模式匹配都叫匹配成功

2.pattern中×前的字符与str字符不相同时
①aa b×aa
str指针不动,pattern指针+2

C++代码

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param str string字符串 
     * @param pattern string字符串 
     * @return bool布尔型
     */
    bool match(string str, string pattern) {
        // write code here
        return matchCore(str,pattern);
    }
    bool matchCore(const string&str,const string&pattern){
        if(str.empty()&& pattern.empty()){
            return true;//两串都为空,此时匹配成功
        }
        if(!str.empty()&&pattern.empty()){
            return false;//pattern为空但str不为空一定不成功
        }
//当pattern出现*字符*前的字符很重要
        if(pattern[1]=='*'){
            if(pattern[0]==str[0]||(pattern[0]=='.'&&!str.empty()))
            {  
//因为此时str可能为空要判断
//下面对应的为当*前字符相同时的三种情况              
                return matchCore(str,pattern.substr(2)) 
                || matchCore(str.substr(1),pattern)
                ||matchCore(str.substr(1),pattern.substr(2));
            }else
            {//对应的时pattern*前的字符与str不相同
                return matchCore(str,pattern.substr(2)); 
            }
        }//当pattern没有*时,看pattern的字符能否和str匹配即可或者此时pattern对应的字符为.因为.可以匹配任意字符
        if(str[0]==pattern[0]||(pattern[0]=='.'&&!str.empty()))
        {
            return matchCore(str.substr(1),pattern.substr(1));
        }
         return false; //这些情况都不符合是说明没有匹配                   
    }
};
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NUC_Dodamce

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值