Word Pattern

Uber

要保证的是a -> dog, dog -> a

对于 bijection mapping 就是两个 hashmap 互相查。

pat和word需要做到一一对应。

可以用一个HashMap来实现,当hashmap有pat的时候,查看对应的string是否和hashmap里面存的一样。 当hashmap没有这个pat的时候,查看对应的string是否已经在hashmap里面存的values里面了。

Isomorphic Strings

Word Pattern II

就是word pattern I 再加上一个backtracking。

使用两个hashmap,程序更好写。

public class Solution {
    public boolean wordPatternMatch(String pattern, String str) {
        return dfs(pattern, str, new HashMap<>(), new HashMap<>());
    }

    private boolean dfs(String pat, String str, HashMap<Character, String> patToWord, HashMap<String,Character> wordToPat) {
        // pattern.length() == 0 代表着搜索的结束,但不是 return true 的充分条件。所以要在 pattern 为 0 的时候正确结束免得越界,同时也要检查 str.length() 是否也等于 0.
        if(pat.length() == 0) return str.length() == 0;

        char p = pat.charAt(0);

        for(int i = 0; i < str.length(); i++) {
            String word = str.substring(0, i + 1);

            if(!patToWord.containsKey(p) && !wordToPat.containsKey(word)) {
                patToWord.put(p, word);
                wordToPat.put(word, p);

                if(dfs(pat.substring(1), str.substring(i + 1), patToWord, wordToPat)) return true;

                patToWord.remove(p);
                wordToPat.remove(word);
            } else if(patToWord.containsKey(p) && wordToPat.containsKey(word)) {
                if(patToWord.get(p).equals(word) && wordToPat.get(word) == p) {
                    if(dfs(pat.substring(1), str.substring(i + 1), patToWord, wordToPat)) return true;
                }
            }
        }
        return false;
    }
}

这种写法在速度上可以进一步改进,比如当看到 char 已经在 map 时,我们就直接把其对应的 word 取出来,没有问题的话就可以继续,否则可以立刻返回 false 进行剪枝和early termination.

results matching ""

    No results matching ""