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
Subscribe to see which companies asked this question.
题意:
实现支持'.'和'*'的正则表达式匹配;
其中'.'匹配任意单个字符;
'*'匹配在*之前的那个字符,0次或多次;
比如“aaa"与”.*"是匹配的;
题解:
动态规划的思想
扫描二维码关注公众号,回复:
2918154 查看本文章
f[i][j]表示s前i个字符与p的前j个字符匹配
case1:s[i] == p[j]
f[i][j] = f[i - 1][j - 1];
case 2: p[i] == '.'
f[i][j] = f[i - 1][j - 1];
case 3: p[i] == '*'
case31: s[i] != p[j - 1] && p[j - 1] != '.'
f[i][j] = f[i][j - 2]; // s*匹配0次(当做不存在)
case32: (else)
f[i][j] = f[i - 1][j] || // s*匹配多次
f[i][j - 1] || // s*匹配一次
f[i][j - 2]; // s*匹配0次(当做空)
Code【Java】
public class Solution {
public boolean isMatch(String s, String p) {
if (s == null || p == null) {
return false;
}
// 动规数组初始化
s = " " + s;
p = " " + p;
boolean[][] f = new boolean[s.length()][p.length()];
f[0][0] = true;
for (int i = 1; i < f[0].length; ++i) {
f[0][i] = (p.charAt(i) == '*') && f[0][i - 2];
}
// 匹配过程
for (int i = 1; i < s.length(); ++i) {
for (int j = 1; j < p.length(); ++j) {
if (s.charAt(i) == p.charAt(j) || p.charAt(j) == '.') {
f[i][j] = f[i - 1][j - 1];
}
if (p.charAt(j) == '*') {
if (s.charAt(i) != p.charAt(j - 1) && p.charAt(j - 1) != '.') {
f[i][j] = f[i][j - 2];
}
else {
f[i][j] = (f[i - 1][j] || f[i][j - 1] || f[i][j - 2]);
}
}
}
}
return f[s.length() - 1][p.length() - 1];
}
}
Code【C++】
class Solution {
public:
bool isMatch(string s, string p) {
// 动规数组初始化
s = s.insert(0, " ");
p = p.insert(0, " ");
vector<vector<bool> > f(s.length(), vector<bool>(p.length(), false));
f[0][0] = true;
for (int i = 1; i < f[0].size(); ++i) {
f[0][i] = (p[i] == '*') && f[0][i - 2];
}
// 匹配过程
for (int i = 1; i < s.size(); ++i) {
for (int j = 1; j < p.size(); ++j) {
if (s[i] == p[j] || p[j] == '.') {
f[i][j] = f[i - 1][j - 1];
}
if (p[j] == '*') {
if (s[i] != p[j - 1] && p[j - 1] != '.') {
f[i][j] = f[i][j - 2];
}
else {
f[i][j] = (f[i - 1][j] || f[i][j - 1] || f[i][j - 2]);
}
}
}
}
return f[s.length() - 1][p.length() - 1];
}
};