docs: public static boolean match(String pattern, String str) {
  		char[] patArr = pattern.toCharArray();
  		char[] strArr = str.toCharArray();
  		int patIdxStart = 0;
  		int patIdxEnd = patArr.length - 1;
  		int strIdxStart = 0;
  		int strIdxEnd = strArr.length - 1;
  		char ch;
  
  		boolean containsStar = pattern.contains("*");
  
  		if (!containsStar) {
  			// No '*'s, so we make a shortcut
  			if (patIdxEnd != strIdxEnd) {
  				return false; // Pattern and string do not have the same size
  			}
  			for (int i = 0; i <= patIdxEnd; i++) {
  				ch = patArr[i];
  				if (ch != '?') {
  					if (ch != strArr[i]) {
  						return false;// Character mismatch
  					}
  				}
  			}
  			return true; // String matches against pattern
  		}
  
  		if (patIdxEnd == 0) {
  			return true; // Pattern contains only '*', which matches anything
  		}
  
  		// Process characters before first star
  		while ((ch = patArr[patIdxStart]) != '*' && strIdxStart <= strIdxEnd) {
  			if (ch != '?') {
  				if (ch != strArr[strIdxStart]) {
  					return false;// Character mismatch
  				}
  			}
  			patIdxStart++;
  			strIdxStart++;
  		}
  		if (strIdxStart > strIdxEnd) {
  			// All characters in the string are used. Check if only '*'s are
  			// left in the pattern. If so, we succeeded. Otherwise failure.
  			for (int i = patIdxStart; i <= patIdxEnd; i++) {
  				if (patArr[i] != '*') {
  					return false;
  				}
  			}
  			return true;
  		}
  
  		// Process characters after last star
  		while ((ch = patArr[patIdxEnd]) != '*' && strIdxStart <= strIdxEnd) {
  			if (ch != '?') {
  				if (ch != strArr[strIdxEnd]) {
  					return false;// Character mismatch
  				}
  			}
  			patIdxEnd--;
  			strIdxEnd--;
  		}
  		if (strIdxStart > strIdxEnd) {
  			// All characters in the string are used. Check if only '*'s are
  			// left in the pattern. If so, we succeeded. Otherwise failure.
  			for (int i = patIdxStart; i <= patIdxEnd; i++) {
  				if (patArr[i] != '*') {
  					return false;
  				}
  			}
  			return true;
  		}
  
  		// process pattern between stars. padIdxStart and patIdxEnd point
  		// always to a '*'.
  		while (patIdxStart != patIdxEnd && strIdxStart <= strIdxEnd) {
  			int patIdxTmp = -1;
  			for (int i = patIdxStart + 1; i <= patIdxEnd; i++) {
  				if (patArr[i] == '*') {
  					patIdxTmp = i;
  					break;
  				}
  			}
  			if (patIdxTmp == patIdxStart + 1) {
  				// Two stars next to each other, skip the first one.
  				patIdxStart++;
  				continue;
  			}
  			// Find the pattern between padIdxStart & padIdxTmp in str between
  			// strIdxStart & strIdxEnd
  			int patLength = (patIdxTmp - patIdxStart - 1);
  			int strLength = (strIdxEnd - strIdxStart + 1);
  			int foundIdx = -1;
  			strLoop: for (int i = 0; i <= strLength - patLength; i++) {
  				for (int j = 0; j < patLength; j++) {
  					ch = patArr[patIdxStart + j + 1];
  					if (ch != '?') {
  						if (ch != strArr[strIdxStart + i + j]) {
  							continue strLoop;
  						}
  					}
  				}
  
  				foundIdx = strIdxStart + i;
  				break;
  			}
  
  			if (foundIdx == -1) {
  				return false;
  			}
  
  			patIdxStart = patIdxTmp;
  			strIdxStart = foundIdx + patLength;
  		}
  
  		// All characters in the string are used. Check if only '*'s are left
  		// in the pattern. If so, we succeeded. Otherwise failure.
  		for (int i = patIdxStart; i <= patIdxEnd; i++) {
  			if (patArr[i] != '*') {
  				return false;
  			}
  		}
  
  		return true;
  	}