剑指Offer:52 正则表达式的匹配

1、递归的灵活运用,尤其是多种情况下如何递归返回

2、字符串的基本性质:char* str 向后移动不能str++,必须str+1

3、各种情况考虑必须严谨,不然很容易漏掉一些可能通过的匹配模式,比如:

(1)'*'前字符相同也可以跳过不匹配;(2)pattern为'.'时要匹配还需要此时str不为'\0' 

class Solution {
public:
    bool match(char* str, char* pattern)
    {
        if(!str || !pattern) {
            return false;
        }
        
        return matchCore(str, pattern);
    }
    
    bool matchCore(char* str, char* pattern) {
        if(*str == '\0' && *pattern == '\0') //字符串和模式串同时走完了,返回true
            return true;
        if(*str != '\0' && *pattern == '\0') //模式串先走完了,字符串没走完,返回false;字符串走完模式串没走完还可能是true!
            return false;
        
        //把当前所有可能的匹配情况列写完整,进行下一步递归判断
        if(*(pattern+1) == '*') { //模式串当前字符的下一个是'*'
            //*前字符 与 str当前字符匹配,还有三种可能
            if(*pattern == *str || (*str != '\0' && *pattern == '.')) {
                return (matchCore(str+1, pattern+2) //*前字符用一次就跳过
                       || matchCore(str+1, pattern) //*前字符用>1次(这个是我没想到的难点!!!)
                       || matchCore(str, pattern+2)); //*前字母一次不用(这个是很容易很容易漏掉的点,总认为匹配上了str就要后移一位)
                                                     //比如 "abc" "ab*bc",第一个'*'前的'b'匹配了对应位置的'b',但还是要跳过
            }
            //*前字符 与 str当前字符不匹配,只有跳过这一种可能了
            else { //不需要加判断
                return matchCore(str, pattern+2);
            }
        }
        
        else{ //模式串当前字符的下一个不是'*'
            if((*str == *pattern) || (*pattern == '.' && *str != '\0'))
                return matchCore(str+1, pattern+1); //当前字符满足,继续递归向后判断 //Bug:str++会时间溢出,改成str+1才对!语法错误
        }
        
        //当前就不匹配,不必递归直接返回false
        return false;
    }
};
发布了97 篇原创文章 · 获赞 11 · 访问量 2460

猜你喜欢

转载自blog.csdn.net/chengda321/article/details/104276828