算法题-实现一个函数用来匹配'.'和'*'的正则表达式

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

思路:递归实现串中子串迭代

每次分别在string 和patt中取一个字符进行匹配,如果匹配,则匹配下一个字符,否则,返回并且不匹配。
匹配递归函数为bool match(char* string, char* patt);

如果模式匹配字符的下一个字符是‘*’

  • 且如果patt当前字符和string的当前字符匹配,:\则会有三种可能情况
    (1)patt当前字符能匹配 string 中的 0 个字符:match(string, patt+2)

        matchCore(str,patt+2):模式串未匹配
    

    (2)patt当前字符能匹配 string 中的 1 个字符:match(string+1, patt+2)

        matchCore(str+1,patt+2):模式串已经成功匹配,并且不匹配下一个字符串内容
    

    (3)patt当前字符能匹配 string 中的 多 个字符:match(string+1, patt)

        matchCore(str+1,patt):模式串已经匹配成功,尝试匹配下一个字符串
    
  • 如果patt当前字符和和string的当前字符不匹配
    patt当前字符能匹配 string 中的 0 个字符:(string, patt+2)
    如果模式匹配字符的下一个字符不是‘*’,进行逐字符匹配。
    对于 ‘.’ 的情况比较简单,’.’ 和一个字符匹配 match(string+1, patt+1)
    另外注意的是:空字符串”” 和 “.*” 是匹配的

代码:

class Solution {
public:
    bool match(char* string, char* patt) {
        if(string==NULL||patt==NULL) return false; //string或者patt不存在
        return matchCore(string,patt);//成功开始匹配
    }
    bool matchCore(char* string, char* patt) {
        if(*string=='\0'&&*patt=='\0') return true;//string和patt同时等于'\0'才能认为两个字符串匹配
        if(*string!='\0'&&*patt=='\0') return false;
        if(*(patt+1)=='*') {//如果patt的第下一个字符是'*'
            if(*patt==*string||(*patt=='.'&&*string!='\0'))
            /*matchCore(string+1,patt)模式串已经匹配成功,尝试匹配下一个字符串*/
            return matchCore(string+1,patt)||matchCore(string,patt+2);/*matchCore(string+1,patt)模式串已经匹配成功,并且不尝试匹配下一个字符串*/
            else
                return matchCore(string,patt+2);//patt未成功匹配
        }
        if(*string==*patt||(*patt=='.'&&*string!='\0')) return matchCore(string+1,patt+1);//成功匹配一次
        return false;//匹配失败
    }
};

你可能感兴趣的:(C++,C,刷题,笔试/面试,python)