Implement regular expression matching with support for '.' and '*'.express
'.' 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
public class Solution { public boolean isMatch(String s, String p) { // s.substring[0,i] matched p.substring[0,j] boolean[][] matched = new boolean[s.length() + 1][p.length() + 1]; matched[0][0] = true; for(int j=1; j<p.length(); j += 2){ if(p.charAt(j) == '*') { matched[0][j+1] = matched[0][j-1]; //matched zero before } } for(int i=1; i<=s.length(); i++){ for(int j=1; j<=p.length(); j++){ if(p.charAt(j-1) != '*'){ matched[i][j] = matched[i-1][j-1] && isCharMatch(s.charAt(i-1), p.charAt(j-1)); } else { // 解釋清楚這兩個條件是如何推導的。 // i,j-2 表示match zero char, i維持原位置,j位置的*,和j-1位置的char一同消失。 // i-1,j 表示match one char, s(i-1)和p(j-2)位置char是否相同. matched[i][j] = matched[i][j-2] || matched[i-1][j] && isCharMatch(s.charAt(i-1), p.charAt(j-2)); } } } return matched[s.length()][p.length()]; } public boolean isCharMatch(char s, char p){ return p == '.' || s == p; } }
s = "ab" p = ".*" . * T F T a F T T b F F T