题目:
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
描述:实现正则表达式中的两个通配符
解法:目前主要解法是用DP和回溯,下面是DP的状态转移方程:
f(i,j)表示s[0...i]是否可以用p[0...j]匹配,为bool值
那么只有以下几种情况可以使得f(i,j)为真:
当p[j]=='*'时,f(i,j-1)==ture 或者 (p[j]==s[i] or p[j]=='.' ) and f(i-1,j)==true or f(i-1, j-2)
当p[j]!='*'时,p[j]==s[i] or p[j]=='.' and f(i-1,j-1)==true
solution by python:
class Solution:
# @return a boolean
def isMatch(self, s, p):
dp = [[False for i in range(len(p)+1)] for j in range(len(s)+1)]
dp[0][0] = True
for i in range(len(p)):
if p[i] == '*': dp[0][i+1] = dp[0][i-1]
for i in range(len(s)):
for j in range(len(p)):
if p[j] == '*':
if p[j-1] == s[i] or p[j-1]=='.':
dp[i+1][j+1] = dp[i+1][j-1] or dp[i][j-1] or dp[i][j+1]
else:
dp[i+1][j+1] = dp[i+1][j-1]
else:
if p[j]==s[i] or p[j]=='.': dp[i+1][j+1] = dp[i][j]
return dp[len(s)][len(p)]
solution by c++:
回溯实现
class Solution {
public:
bool isMatch(const char *s, const char *p) {
if(*p == '\0') return *s=='\0';
if(*s == '\0'){
if(*p == '\0') return true;
else if(*(p+1) != '*') return false;
return isMatch(s, p+2);
}
if(*s == *p || *p == '.'){
if(*(p+1) != '*') return isMatch(s+1, p+1);
return isMatch(s,p+2) ||isMatch(s+1, p);
}
if(*(p+1) != '*') return false;
return isMatch(s, p+2);
}
};