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
Personal tips:这道题真的挺难的,使用递归算法,时间太长了,应该用dp改进,以下是递归的代码实现:
class Solution {
public:
bool isMatch(string s, string p) {
int i = 0, j = 0;
if (p.empty()) return s.empty();
if (p[j + 1] != '*')
{
if (s[i] == p[j]|| (p[j] == '.'&&s[i] != '\0')) return isMatch(s.substr(i + 1), p.substr(j + 1));
else return false;
}
while (s[i]==p[j]||(p[j]=='.'&&s[i]!='\0'))
{
if (isMatch(s.substr(i), p.substr(j + 2))) return true;
++i;
}
return isMatch(s.substr(i), p.substr(j + 2));
}
};
以下为参考LeetCode后的动态规划dp算法实现代码:
class Solution {
public:
bool isMatch(string s, string p) {
if (s.empty()&&p.empty()) return true;
if ( p.empty()) return false;
vector<vector<bool>> dp(s.size() + 1, vector<bool>(p.size() + 1, false));
dp[0][0] = true;
for (int i = 0; i < s.size() + 1; ++i)
{
for (int j = 1; j < p.size() + 1; ++j)
{
if (i>0&&(s[i-1] == p[j-1] || p[j-1] == '.')) dp[i][j] = (dp[i - 1][j - 1]?true:dp[i][j]);
if (p[j-1] == '*')
{
if (i>0&&(p[j - 1-1] == s[i-1]|| p[j - 1 - 1] == '.'))
{
dp[i][j] = dp[i][j - 1] || dp[i - 1][j]||dp[i][j-2];
}
else
{
dp[i][j] = dp[i][j - 2];
}
}
}
}
return dp[s.size()][p.size()];
}
};