🥺291 word pattern II

https://leetcode.com/problems/word-pattern-ii/

太难写对了

class Solution {
    public boolean wordPatternMatch(String pattern, String s) {
        Map<Character, String> map = new HashMap<>();
        Map<String, Character> seen = new HashMap<>();
        //注意是s.length不是pattern.length
        return match(pattern.toCharArray(), 0, 0, s.length(), s, map, seen);
    }
    private boolean match(char[] pattern, int index, int start, int end, String s, 
                          Map<Character, String> map, Map<String, Character> seen) {
      // 防止字母都match完了s还没到头
        if (index == pattern.length) return start == end;
        char ch = pattern[index];
        if (map.containsKey(ch)) {
            String sub = s.substring(start, end);
            if (map.get(ch).equals(sub)){
                // 防止字母还没match完,s就到头了
                return index == pattern.length - 1;
            } else {
            // startsWith是个好东西!!!!!
                if (sub.startsWith(map.get(ch))) {
                    return match(pattern, index + 1, 
                    start + map.get(ch).length(), end, s, map, seen);
                }
                return false;
            }
        }
        for (int i = start; i < end; i++) {
            String sub = s.substring(start, i + 1);
            //防止两个ch对应了同样的substring
            if (seen.get(sub) != null && seen.get(sub) != ch) continue;
            map.put(ch, sub);
            seen.put(sub, ch);
            if (match(pattern, index + 1, i + 1, end, s, map, seen)) return true;
            // 两个都要吐出来!!!!
            // 否则的话可能会有深层次的递归遇到同样的ch加一些奇怪的东西在map里
            seen.remove(sub);
            map.remove(ch);
        }
        return false;
    }
}

Last updated