import java.util.*;

public class Solution {

public boolean match (String str, String pattern) {
    // write code here
    ArrayList<String> patterns = splitString2List(pattern);
    return recursion(str, patterns, 0, 0);
}

public ArrayList<String> splitString2List(String pattern) {
    ArrayList<String> patterns = new ArrayList<>();
    for (int i = 0; i < pattern.length(); ) {
        if (i < pattern.length() - 1 && pattern.charAt(i + 1) == '*') {
            patterns.add(pattern.substring(i, i + 2));
            i += 2;
        } else {
            patterns.add(pattern.substring(i, i + 1));
            i++;
        }
    }
    return patterns;
}

public boolean recursion(String str, ArrayList<String> patterns,
                         int sub_str_index, int sub_pattern_index) {
    if(sub_str_index < str.length() && sub_pattern_index >= patterns.size()) return false;
    if(sub_str_index >= str.length() && sub_pattern_index >= patterns.size()) return true;
    for (int i = sub_str_index; i <= str.length(); i++) {
        boolean flag1 = subMatch(str.substring(sub_str_index, i), patterns.get(sub_pattern_index));
        if(!flag1) continue;
        boolean flag2 = recursion(str, patterns, i, sub_pattern_index + 1);
        if (flag2) return true;
    }
    return false;
}

public boolean subMatch(String str, String subPattern) {
    if (".*".equals(subPattern)) {
        return true;
    } else if (".".equals(subPattern) && str.length() == 1) {
        return true;
    } else if (str.equals(subPattern)) {
        return true;
    } else if(subPattern.length() == 2){
        char c = subPattern.charAt(0);
        for (int i = 0; i < str.length(); i++) {
            if (c != str.charAt(i)) return false;
        }
        return true;
    }
    return false;
}

}