剑指offer---19(正则表达式匹配)

更多题目请点链接:《剑指offer》目录索引


问题描述:

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

思路:

求匹配的表达式,首先就要分清楚什么情况是匹配的,什么情况是不匹配的,故先来看以下的几种情况:
1.模式字符串中不含‘ * ’ :由题可知‘ . ’可代表任意字符,故可直接进行匹配
2.模式字符串中含有‘ * ’:‘ * ’在字符串中的位置也有一特殊位置—第二个字符是‘ * ’,当第一个字符匹配,第二个是‘ * ’,又可分为以下几种情况:

1)原字符串的第二个字符与’ * ‘前面字符匹配

剑指offer---19(正则表达式匹配)_第1张图片
2)原字符串的第二个字符与‘ * ’后面字符匹配

剑指offer---19(正则表达式匹配)_第2张图片
3)原字符串的第一个字符与’ * ‘后面字符匹配

剑指offer---19(正则表达式匹配)_第3张图片

代码:

#include"matchCore.h"

int  MatchCore(const char* str,const char* model)
{
    //当两个字符串比较完毕,都在结尾时即为匹配
    if(*str=='\0' &&  *model=='\0')
        return 1;
    //字符串长度不同,不匹配
    if(*str!='\0' && *model== '\0')
        return 0;

    //第二个字符是‘*’
    if(*(model+1)=='*')
    {
            //第一个字符匹配
        if(*model==*str || (*model=='.' && *str!='\0'))
        {   //三种情况
            return MatchCore(str+1,model)||
                   MatchCore(str+1,model+2)||
                   MatchCore(str,model+2);
        }
        else
        {
            return MatchCore(str,model+2);
        }
    }

    if(*model==*str || (*model=='.' && *str!='\0'))
    {
        return MatchCore(str+1,model+1);
    }

    return 0;
}


int match(const char* str,const char* model)
{
    //有一个为空即为不匹配
    if(str==NULL || model==NULL)
        return  0;

    return  MatchCore(str,model);
}

测试及结果:

测试代码:

#include"matchCore.h"

void Test(const char* testName, const char* string, const char* pattern)
{
    if (testName != NULL)
        printf("%s begins: ", testName);

    if (match(string, pattern) == 1)
        printf("Passed.\n");
    else
        printf("FAILED.\n");
}

int main()
{
    Test("Test01", "", "");
    Test("Test02", "", ".*");
    Test("Test03", "", ".");
    Test("Test04", "", "c*");
    Test("Test05", "a", ".*");
    Test("Test06", "a", "a.");
    Test("Test07", "a", "");
    Test("Test08", "a", ".");
    Test("Test09", "a", "ab*");
    Test("Test10", "a", "ab*a");
    Test("Test11", "aa", "aa");
    Test("Test12", "aa", "a*");
    Test("Test13", "aa", ".*");
    Test("Test14", "aa", ".");
    Test("Test15", "ab", ".*");
    Test("Test16", "ab", ".*");
    Test("Test17", "aaa", "aa*");
    Test("Test18", "aaa", "aa.a");
    Test("Test19", "aaa", "a.a");
    Test("Test20", "aaa", ".a");
    Test("Test21", "aaa", "a*a");
    Test("Test22", "aaa", "ab*a");
    Test("Test23", "aaa", "ab*ac*a");
    Test("Test24", "aaa", "ab*a*c*a");
    Test("Test25", "aaa", ".*");
    Test("Test26", "aab", "c*a*b");
    Test("Test27", "aaca", "ab*a*c*a");
    Test("Test28", "aaba", "ab*a*c*a");
    Test("Test29", "bbbba", ".*a*a");
    Test("Test30", "bcbbabab", ".*a*a");
    return 0;
}

结果:

剑指offer---19(正则表达式匹配)_第4张图片

你可能感兴趣的:(剑指offer面试题)