1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| class Solution { public boolean isMatch(String s, String p) { boolean[][] dp = new boolean[s.length() + 1][p.length() + 1];
dp[0][0] = true; for (int j = 2; j <= p.length() && p.charAt(j - 1) == '*'; j += 2) { dp[0][j] = true; }
for (int i = 1; i <= s.length(); i++) { for (int j = 1; j <= p.length(); j++) { char sc = s.charAt(i - 1); char pc = p.charAt(j - 1); if (pc == '.') { dp[i][j] = dp[i - 1][j - 1]; } else if (pc == '*') { char pre = p.charAt(j - 2); dp[i][j] = dp[i][j - 2]; dp[i][j] |= dp[i - 1][j - 1] && (pre == '.' || sc == pre); dp[i][j] |= dp[i - 1][j] && (pre == '.' || sc == pre); } else { dp[i][j] = dp[i - 1][j - 1] && sc == pc; } } }
return dp[s.length()][p.length()]; } }
|
注意 * 匹配 0 次时需要将 * 前面的字符消除。
References
10. Regular Expression Matching
剑指 Offer 19. 正则表达式匹配
逐行详细讲解,由浅入深,dp和递归两种思路