LeetCode 10. Regular Expression Matching
Description
Given an input string (s
) and a pattern (p
), 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).
Note
s
could be empty and contains only lowercase lettersa-z
.p
could be empty and contains only lowercase lettersa-z
, and characters like.
or*
.
Example
Code
- java
class Solution {
public boolean isMatch(String s, String p) {
char[] str1 = s.toCharArray();
char[] str2 = p.toCharArray();
int len1 = str1.length, len2 = str2.length;
return isMatchCore(str1, 0, len1, str2, 0, len2);
}
public boolean isMatchCore(char[] str1, int cur1, int len1, char[] str2, int cur2, int len2) {
if(cur1 == len1 && cur2 == len2) return true;
else if(cur2 == len2) return false;
boolean result = false;
if(cur2 + 1 < len2 && str2[cur2+1] == '*') {
if(cur1 < len1 && (str2[cur2] == '.' || str1[cur1] == str2[cur2])) {
result = isMatchCore(str1, cur1+1, len1, str2, cur2, len2) || isMatchCore(str1, cur1, len1, str2, cur2+2, len2) || isMatchCore(str1, cur1+1, len1, str2, cur2+2, len2);
} else {
result = isMatchCore(str1, cur1, len1, str2, cur2+2, len2);
}
} else if(cur1 < len1 && (str1[cur1] == str2[cur2] || str2[cur2] == '.')) {
result = isMatchCore(str1, cur1+1, len1, str2, cur2+1, len2);
}
return result;
}
}
- Official solution1
class Solution {
public boolean isMatch(String text, String pattern) {
if (pattern.isEmpty()) return text.isEmpty();
boolean first_match = (!text.isEmpty() &&
(pattern.charAt(0) == text.charAt(0) || pattern.charAt(0) == '.'));
if (pattern.length() >= 2 && pattern.charAt(1) == '*'){
return (isMatch(text, pattern.substring(2)) ||
(first_match && isMatch(text.substring(1), pattern)));
} else {
return first_match && isMatch(text.substring(1), pattern.substring(1));
}
}
}
- Official solution2(Dynamic Programming)
//O(len1*len2)
class Solution {
public boolean isMatch(String text, String pattern) {
boolean[][] dp = new boolean[text.length() + 1][pattern.length() + 1];
dp[text.length()][pattern.length()] = true;
for (int i = text.length(); i >= 0; i--){
for (int j = pattern.length() - 1; j >= 0; j--){
boolean first_match = (i < text.length() &&
(pattern.charAt(j) == text.charAt(i) ||
pattern.charAt(j) == '.'));
if (j + 1 < pattern.length() && pattern.charAt(j+1) == '*'){
dp[i][j] = dp[i][j+2] || first_match && dp[i+1][j];
} else {
dp[i][j] = first_match && dp[i+1][j+1];
}
}
}
return dp[0][0];
}
}
Conclusion
- 之前做过剑指 offer上的这题,然后递归时间复杂度高,后来参考了官方解答,动态规划牛逼(破音)