10. Regular Expression Matching

来源:互联网 发布:淘宝原创衣服品牌 编辑:程序博客网 时间:2020/10/20 17:19

需要用递归Recursion来解,大概思路如下:

- 若p为空,若s也为空,返回true,反之返回false

- 若p的长度为1,若s长度也为1,且相同或是p为'.'则返回true,反之返回false

- 若p的第二个字符不为*,若此时s为空返回false,否则判断首字符是否匹配,且从各自的第二个字符开始调用递归函数匹配

- 若p的第二个字符为*,因为不能确定*到底会匹配几个,在当前字符匹配的前提下,要枚举所有的情况,从假设匹配0个,1个,2个。。。只要有一种情况成功了,最终也就成功了。

- 返回调用递归函数匹配s和去掉前两个字符的p的结果

class Solution {public:    bool isMatch(string s, string p) {        if(p.empty())   return s.empty();        if(p.size() == 1){            return (s.size() == 1 && (s[0] == p[0] || p[0] == '.'));        }        if(p[1] != '*'){            if(s.empty())   return false;            return (s[0] == p[0] || p[0] == '.') && isMatch(s.substr(1), p.substr(1));        }        while(!s.empty() && (s[0] == p[0] || p[0] == '.')){            if(isMatch(s, p.substr(2))) return true;            s = s.substr(1);        }        return isMatch(s, p.substr(2));    }};

还有动态规划方法,参考http://www.cnblogs.com/grandyang/p/4461713.html


原创粉丝点击