问下述代码函数的时间复杂度和空间复杂度分别为(),str长度为n,pattern的长度为m。
 /**
   * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
   *
   * 
   * @param str string字符串 
   * @param pattern string字符串 
   * @return bool布尔型
   */
  public boolean match (String str, String pattern) {
      // 加上空串,0~n
      boolean[][] dp = new boolean[str.length()+1][pattern.length()+1];
      // 两个都是空串
      dp[0][0] = true;
      // 字符串为空,正则表达式不为空
      for (int i = 2; i < dp[0].length; ++i){
          // 正则表达式从下标0开始
          if (pattern.charAt(i-1) == '*'){
              // 从下标1开始
              dp[0][i] = dp[0][i-2];
          }
      }
      // 状态转移
      for (int i = 1;i < dp.length;++i){
          for (int j = 1;j < dp[0].length;++j){
              if (pattern.charAt(j-1) != '*'){
                  if (pattern.charAt(j-1) == '.' || 
                      pattern.charAt(j-1) == str.charAt(i-1)){
                      dp[i][j] = dp[i-1][j-1];
                  }
              }else if (j >= 2 && pattern.charAt(j - 1) == '*'){
                  // 对于包含 * 的匹配
                  // 当前一位为 '.', 或者字符相等,则匹配
                  if (pattern.charAt(j - 2) == '.' ||
                      pattern.charAt(j - 2) == str.charAt(i - 1)) {
                      dp[i][j] = dp[i][j - 2] ||
                          dp[i - 1][j - 2] ||
                          dp[i - 1][j];
                  } else {
                      // 否则只能不匹配
                      dp[i][j] = dp[i][j - 2];
                  }
              }
          }
      }
      return dp[str.length()][pattern.length()];
  }