题目: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”, “.*”) → false
isMatch(“aab”, “c*a*b”) → true
思路: 这道题目让我们去判断正则表达式是否匹配,其中‘.’表示可以匹配任何一个字符,’ * ‘表示它前面的一个字符可以有0个、1个或者多个,比如A *可以表示成:”、’A’、’AA’等等。利用动态规划的思想,令dp[i][j]表示s前i个字符与p的前j个字符是否匹配,状态转移方程为:
当p[i-1] != ‘*’时,dp[i][j] = (s[i-1]==p[j-1] || p[j-1]==’.’)&&dp[i-1][j-1];
当p[i-1]==’*’时,dp[i][j] = (s[i-1]==p[j-2] || p[j-2]==’.’)&&dp[i-1][j] || dp[i][j-2];
代码如下:
class Solution {
public:
bool isMatch(string s, string p) {
if (s.size()==0 && p.size()== 0) return true;
int m = s.size(), n = p.size();
vector<vector<bool> > dp(m+1, vector<bool>(n+1, false));
//init
dp[0][0] = true;
for (int j = 1; j <= n; j++) dp[0][j] = (p[j-1]=='*') && dp[0][j-2];
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
if (p[j-1] != '*') dp[i][j] = (s[i-1]==p[j-1] || p[j-1]=='.')&&dp[i-1][j-1];
else dp[i][j] = (s[i-1]==p[j-2] || p[j-2]=='.')&&dp[i-1][j] || dp[i][j-2];
}
}
return dp[m][n];
}
};