291. Word Pattern II

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

image.png

这道题因为就是PATTERN的一个字母可以对应一个STRING,我们可以用枚举然后回溯看有没有可能的解。
举个例子
pattern = "abab", str = "redblueredblue"
先拿a映射r,b映射e,来了一个出现过的字母,就看后面的东西是不是和A映射的R是一致的。如果不一致,就回溯,说明B映射E不可行。那么B映射ED行不行呢?以此类推。
这里正过来要对应,反过来也要对应。比如A映射E,那么B就不能也映射到E。所以我们还需要检查一个新字符要去映射的时候,从后面取的,有没有被前面的其他字符映射过。如果映射过,要CONTINUE这个可能性。
代码如下:

Map map = new HashMap<>();
    Map map2 = new HashMap<>();
    public boolean wordPatternMatch(String aa, String bb) {
        return help(aa,0,bb,0);
    }
    
    private boolean help(String aa, int i, String bb, int j) {
        if(i == aa.length()){
            return j == bb.length();
        }
        char c = aa.charAt(i);
        if(map.containsKey(c)){
            if(bb.startsWith(map.get(c), j)){
                return help(aa,i+1,bb,j+map.get(c).length());
            }
            return false;
        }else{
            for(int k = j+1; k <= bb.length(); k++){
                String cur = bb.substring(j,k);
                if(map2.containsKey(cur)) continue;
                map.put(c, cur);
                map2.put(cur, c);
                if(help(aa,i+1,bb,k)) return true;
                map2.remove(cur);
            }
            map.remove(c);
        }
        return false;
    }

你可能感兴趣的:(291. Word Pattern II)