LeetCode-10. Regular Expression Matchinghttps://leetcode.com/problems/regular-expression-matching/
题目描述
Given an input string s
and a pattern p
, implement regular expression matching with support for '.'
and '*'
where:
'.'
Matches any single character.'*'
Matches zero or more of the preceding element.
The matching should cover the entire input string (not partial).
Example 1:
Input: s = "aa", p = "a" Output: false Explanation: "a" does not match the entire string "aa".
Example 2:
Input: s = "aa", p = "a*" Output: true Explanation: '*' means zero or more of the preceding element, 'a'. Therefore, by repeating 'a' once, it becomes "aa".
Example 3:
Input: s = "ab", p = ".*" Output: true Explanation: ".*" means "zero or more (*) of any character (.)".
Constraints:
1 <= s.length <= 20
1 <= p.length <= 30
s
contains only lowercase English letters.p
contains only lowercase English letters,'.'
, and'*'
.- It is guaranteed for each appearance of the character
'*'
, there will be a previous valid character to match.
解题思路
【C++】
1. 动态规划
class Solution {
public:
bool isMatch(string s, string p) {
int m = s.size(), n = p.size();
vector<vector<bool>> dp(m +1, vector<bool>(n + 1, false));
dp[0][0] = true;
for (int i = 1; i < n + 1; ++i) {
if (p[i-1] == '*') {
dp[0][i] = dp[0][i-2];
}
}
for (int i = 1; i <= m; ++i) {
for (int j = 1; j <= n; ++j) {
if (p[j-1] == '.') {
dp[i][j] = dp[i-1][j-1];
} else if (p[j-1] != '*') {
dp[i][j] = dp[i-1][j-1] && s[i-1] == p[j-1];
} else if (p[j-2] != s[i-1] && p[j-2] != '.') {//p[j-1] = '*'
dp[i][j] = dp[i][j-2];
} else { //p[j-1] == '*' && (s[i-1] == p[j-2] || p[j-2] == '.')
dp[i][j] = dp[i][j-1] || dp[i][j-2] || dp[i-1][j];
}
}
}
return dp[m][n];
}
};
2. 递归
class Solution {
public:
bool isMatch_i(string &s, string &p, int start_s, int start_p) {
int si = start_s, pi = start_p;
while (pi < p.length()) {
if (pi + 1 < p.length() && p[pi+1] == '*') {
if (p[pi] == '*') {return false;}
while (si < s.length() && (s[si] == p[pi] || p[pi] == '.')) {
if (isMatch_i(s, p, si, pi+2)) {return true;}
si++;
}
if(isMatch_i(s, p, si, pi+2)) {return true;}
return false;
} else if (si==s.length()) {return false;}
else if (s[si]==p[pi] || p[pi]=='.') {
si++;
pi++;
} else {return false;}
}
return (si==s.length());
}
bool isMatch(string s, string p) {
return isMatch_i(s, p, 0, 0);
}
};
【Java】
class Solution {
public boolean isMatch(String s, String p) {
int m = s.length(), n = p.length();
boolean[][] dp = new boolean[m + 1][n + 1];
dp[0][0] = true;
for (int i = 1; i < n + 1; ++i) {
if (p.charAt(i-1) == '*') {
dp[0][i] = dp[0][i-2];
}
}
for (int i = 1; i <= m; ++i) {
for (int j = 1; j <= n; ++j) {
if (p.charAt(j-1) == '.') {
dp[i][j] = dp[i-1][j-1];
} else if (p.charAt(j-1) != '*') {
dp[i][j] = dp[i-1][j-1] && s.charAt(i-1) == p.charAt(j-1);
} else if (p.charAt(j-2) != s.charAt(i-1) && p.charAt(j-2) != '.') {//p[j-1] = '*'
dp[i][j] = dp[i][j-2];
} else { //p[j-1] == '*' && (s[i-1] == p[j-2] || p[j-2] == '.')
dp[i][j] = dp[i][j-1] || dp[i][j-2] || dp[i-1][j];
}
}
}
return dp[m][n];
}
}