public boolean isMatch_2d_method(String s, String p) {
		int m=s.length(), n=p.length();
		boolean[][] dp = new boolean[m+1][n+1];
		dp[0][0] = true;
		for (int i=1; i<=m; i++) {
			dp[i][0] = false;
		}
		// preprocess *
		for(int j=1; j<=n; j++) {
			if(p.charAt(j-1)=='*'){
				dp[0][j] = true;
			} else {
				break;
			}
		}

		for(int i=1; i<=m; i++) {
			for(int j=1; j<=n; j++) {
				if (p.charAt(j-1)!='*') {
					dp[i][j] = dp[i-1][j-1] && (s.charAt(i-1)==p.charAt(j-1) || p.charAt(j-1)=='?');
				} else {
					//dp[i-1][j] - * matches s.charAt(i-1)
					//dp[i][j-1] - * is "", s.charAt(i-1) to match p.charAt(j-2)
					dp[i][j] = dp[i-1][j] || dp[i][j-1];
				}
			}
		}
		return dp[m][n];
	}