标签:
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") → false isMatch("aa","aa") → true isMatch("aaa","aa") → false isMatch("aa", "a*") → true isMatch("aa", ".*") → true isMatch("ab", ".*") → true isMatch("aab", "c*a*b") → true
这道求正则表达式匹配的题和那道 Wildcard Matching 通配符匹配的题很类似,不同点在于*的意义不同,在之前那道题中,*表示可以代替任意个数的字符,而这道题中的*表示之前那个字符可以有1个或是多个,就是说,字符串a*b,可以表示b或是aaab,即a的个数任意,这道题的难度要相对之前那一道大一些,分的情况的要复杂一些,需要用递归Recursion来解,大概思路如下:
- 若p为空,若s也为空,返回true,反之返回false
- 若p的长度为1,若s长度也为1,且相同或是p为‘.‘则返回true,反之返回false
- 若p的第二个字符不为*,若此时s为空返回false,否则判断首字符是否匹配,且从各自的第二个字符开始调用递归函数匹配
- 若p的第二个字符为*,若s不为空且字符匹配,调用递归函数匹配s和去掉前两个字符的p,若匹配返回true,否则s去掉首字母
- 返回调用递归函数匹配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)); } };
此题还有用动态规划Dynamic Programming的解法,具体可参见网友Code Ganker的博客。
[LeetCode] Regular Expression Matching 正则表达式匹配
标签:
原文地址:http://www.cnblogs.com/grandyang/p/4461713.html