关闭

Regular Expression Matching 递归

334人阅读 评论(0) 收藏 举报
分类:

思路:
递归。时间复杂度O(N),空间复杂度O(1)。

* 代表可以匹配 0个 或 多个 前导字符;
. 代表可以匹配任意一个字符;

如果p[i]匹配到了最后的'\0',这是s[i]也到最后的'\0' ,则匹配成功,否则,失败;

如果没到最后,且如果 当前字符的下一个字符不是 * ,必须一一匹配;

如果没到最后,且如果 当前字符是 * ,看 * 的作用是1次or多次是否可以匹配;

最后,看* 的作用是0次是否匹配;

class Solution {
private:
    bool matchHelper(string &s, string &p, int i, int j) {
        if(p[j] == '\0') {
            return s[i] == '\0';
        }
        if(p[j+1] != '*') {
            if((s[i] == p[j]) || (p[j] == '.' && s[i] != '\0')) {
                return matchHelper(s, p, i+1, j+1);
            }else {
                return false;
            }
        }
        while((s[i] == p[j]) || (p[j] == '.' && s[i] != '\0')) {
            if(matchHelper(s, p, i, j+2)) {
                return true;
            }
            ++i;
        }
        return matchHelper(s, p, i, j+2);
    }
public:
    bool isMatch(string s, string p) {
        return matchHelper(s, p, 0, 0);
    }
};
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    Always Be Coding
    个人资料
    • 访问:814349次
    • 积分:10421
    • 等级:
    • 排名:第1600名
    • 原创:445篇
    • 转载:54篇
    • 译文:0篇
    • 评论:114条
    文章分类