54. 正则表达式匹配

题目描述

请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配

思路:

1) str和pattern同时为空,则返回true;

2) str不为空,pattern为空,则返回false;

3) str为空,pattern不为空,这种情况下,答案不确定,如果:str == NULL, pattern = 'a*a*a*a*',那么*前面的字符出现0次的时候就是true,但是如果str == NULL,pattern = 'aa*a*a*',就是false;所以这种情况下要考虑pattern中当前字符的下一位是否是'*';

4) str 不为空,pattern也不为空,这种情况下,答案不能确定,要将str与pattern按位比较,同时在比较前要判断pattern中当前字符的下一位是否为'*';

所以,3) 和4) 和为一种,先判断pattern中当前位的下一位是否为'*' :

如果不是'*',那么就直接匹配,如果*str==*pattern或者*str != '\0'的同时*pattern == '.',那么继续比较str和pattern的下一位,即str+1 和pattern + 1;否则,返回false;

如  果  是 '*',那么分两种情况:

① 如果*str==*pattern或者*str != '\0'的同时*pattern == '.',也就是str与pattern的当前字符相同时,要看*前的字符出现的次数,如果*匹配0个字符,那么要忽略这个字符(例如str == 'a', pattern == 'a*a',这种情况下能匹配成功,前提是*匹配的a出现0次),接着比较str与pattern+2,如果*匹配1个字符,那么接着比较str+1和pattern+2,如果*匹配2个及以上字符,也就是当前字符出现次数大于等于2,那么比较str+1与pattern;

② *str==*pattern或者*str != '\0'的同时*pattern == '.'的else,就认为*前的字符出现了0次,继续比较str与pattern+2

下面是两种写法:

char *str 定义了一个字符串指针
str+1,是指a中保存的内存地址加1

class Solution {
public:
    bool match(char* str, char* pattern)
    {
        if (*str == '\0' && *pattern == '\0')
            return true;
        if (*str != '\0' && *pattern == '\0')
            return false;
        if (*(pattern+1) == '*')
        {
            if (*str == *pattern || (*str != '\0' && *pattern == '.'))
                return match(str, pattern+2) || match(str+1, pattern+2) || match(str+1, pattern);
            else
                return match(str, pattern+2);
        }
        else
        {
            if (*str == *pattern || (*str != '\0' && *pattern == '.'))
                return match(str+1, pattern+1);
            else
                return false;
        }
    }
};
class Solution {
public:
    bool match(char* str, char* pattern)
    {
        if (str[0] == '\0' && pattern[0] == '\0')
            return true;
        if (str[0] != '\0' && pattern[0] == '\0')
            return false;
        if (pattern[1] == '*')
        {
            if (str[0] == pattern[0] || (str[0] != '\0' && pattern[0] == '.'))
                return match(str, pattern+2) || match(str+1, pattern+2) || match(str+1, pattern);
            else
                return match(str, pattern+2);
        }
        else
        {
            if (str[0] == pattern[0] || (str[0] != '\0' && pattern[0] == '.'))
                return match(str+1, pattern+1);
            else
                return false;
        }
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值