我遇到了这个问题,要求你实现一个支持'.'和'*'的正则表达式匹配器,其中:
'.' 匹配任何单个字符。
'*' 匹配前面的元素零次或多次。
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的解决方案,比如下面这个:
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];
}
}
我很难理解这个问题。我已经解决了一些涉及格子的DP问题(如2D网格最短路径和二进制2D网格中的最大正方形),在那里使用DP表对我来说非常合理。然而,在这里,我完全迷失了方向,我无法理解如何通过遍历2D表来解决此问题。此外,当字符不匹配时,我们似乎知道了,所以我不明白为什么我们不在那里停止搜索(这也可能是因为我对表格遍历如何导致解决方案缺乏理解)。有没有关于这类问题的清晰直观的解释?
isMatch("aa", "a")
返回false
吗?我曾经使用过的任何正则表达式引擎都会在要求在字符串"aa"
中查找正则表达式"a"
的匹配项时成功。 - Jim Mischel