LeetCode OJ Regular Expression Matching

来源:互联网 发布:最大公约数的算法 编辑:程序博客网 时间:2024/06/06 13:15

Implement regular expression matching with support for '.' and '*'.

'.' Matches any single character.'*' Matches zero or more of the preceding element.The matching should cover the entire input string (not partial).The function prototype should be:bool isMatch(const char *s, const char *p)Some examples:isMatch("aa","a") → falseisMatch("aa","aa") → trueisMatch("aaa","aa") → falseisMatch("aa", "a*") → trueisMatch("aa", ".*") → trueisMatch("ab", ".*") → trueisMatch("aab", "c*a*b") → true
正则表达式...当然这题算正则表达式中简单的了。

看了discuss才会做,难点在于'*',由于有'*'的存在,s中可能有多个值会被p中的'*'组合代替,但具体s中多长被'*'组合代替了是不得而知的,只能一个长度一个长度试,因此用了递归。

class Solution {public:    bool isMatch(const char *s, const char *p) {          if (*p == '\0') return *s == '\0';  // 注意必须要刚好匹配完        if (*(p + 1) == '*') {            while (*s != '\0' && (*s == *p || *p == '.')) {  // 如果是这种情况,p中两个字符就能代替s中很多字符(当然也有可能一个都不代替)                if (isMatch(s, p + 2)) return true;  // 那么s中可以用p中两个字符代替的字符就不用管了,只用管s中被代替之后的                s++;            }            return isMatch(s, p + 2);        } else {            if (*s != '\0' && (*s == *p || *p == '.')) return isMatch(s + 1, p + 1);  // 如果没有'*',就判断是否匹配            else return false;        }       }};


0 0
原创粉丝点击