public static boolean isMatch(String s, String p) {

    boolean[][] dp = new boolean[p.length() + 1][s.length() + 1];
    dp[0][0] = true;

    // aa a* WHY
    for (int i = 1 ; i < p.length() + 1 ; i++) {
      dp[i][0] = p.charAt(i - 1) == '*' ? dp[i - 2][0] : false;
    }

    for (int i = 1 ; i < p.length() + 1 ; i++) {
      for (int j = 1 ; j < s.length() + 1 ; j++) {
        if (p.charAt(i - 1) == '*') {
          dp[i][j] = match(s.charAt(j - 1), p.charAt(i - 2)) ? (dp[i][j - 1] || dp[i - 2][j]) : dp[i - 2][j];
        } else {
          dp[i][j] = match(s.charAt(j - 1), p.charAt(i - 1)) ? dp[i - 1][j - 1] : false;
        }
      }
    }

    return dp[p.length()][s.length()];
  }