Word Pattern II

Given a pattern and a string str, find if str follows the same pattern.

Here follow means a full match, such that there is a bijection between a letter in pattern and a non-empty substring in str.(i.e if a corresponds to s, then b cannot correspond to s. For example, given pattern = "ab", str = "ss", return false.)

Example

Given pattern = "abab", str = "redblueredblue", return true. Given pattern = "aaaa", str = "asdasdasdasd", return true. Given pattern = "aabb", str = "xyzabcxzyabc", return false.

Notice

You may assume both pattern and str contains only lowercase letters.

思路

  • DFS
  • 有个case没过..没找出来原因
public class Solution {
    /**
     * @param pattern: a string,denote pattern string
     * @param str: a string, denote matching string
     * @return: a boolean
     */
    public boolean wordPatternMatch(String pattern, String str) {
        // write your code here

        Map<Character, String> char_to_string = new HashMap<Character, String>();
        Map<String, Character> string_to_char = new HashMap<String, Character>();

        return dfs(char_to_string, string_to_char, pattern, str, 0, 0);

    }

    public boolean dfs(Map<Character, String> char_to_string, Map<String, Character> string_to_char, String pattern, String str, int pIndex, int sIndex) {
        if (pIndex == pattern.length() && sIndex == str.length()) {
            return true;
        }

        if (pIndex == pattern.length() || sIndex == str.length()) {
            return false;
        }

        char c = pattern.charAt(pIndex);

        for (int i = sIndex + 1; i <= str.length(); i++) {
            String substr = str.substring(sIndex, i);
            boolean isMatched = false;

            if (char_to_string.containsKey(c)) {
                if (!char_to_string.get(c).equals(substr)) {
                    continue;
                }
            } else {
                char_to_string.put(c, substr);
                putChar = true;
            }


            if (string_to_char.containsKey(substr)) {
                if (!string_to_char.get(substr).equals(c)) {
                    continue;
                }
            } else {
                string_to_char.put(substr, c);
                putSubstring = true;
            }


            isMatched = dfs(char_to_string, string_to_char, pattern, str, pIndex + 1, i);
            if (isMatched) {
                return isMatched;
            }

            if (putChar) {
                char_to_string.remove(c);
            }

            if (putSubstring) {
                string_to_char.remove(substr);
            }
        }

        return false;

    }
}

可以过得版本

public class Solution {
    /**
     * @param pattern: a string,denote pattern string
     * @param str: a string, denote matching string
     * @return: a boolean
     */
    public boolean wordPatternMatch(String pattern, String str) {
        Map<Character, String> map = new HashMap<>();
        return dfs(pattern, str, map);
    }

    private boolean dfs(String ptn, String s, Map<Character, String> map) {
        if (ptn.length() == 0 && s.length() == 0) {
            return true;
        }

        if (ptn.length() == 0 || s.length() == 0) {
            return false;
        }

        if (map.containsKey(ptn.charAt(0))) {
            String prefix = map.get(ptn.charAt(0));
            if (!s.startsWith(prefix)) {
                return false;
            }
            return dfs(ptn.substring(1), s.substring(prefix.length()), map);
        }

        for (int i = 1; i <= s.length(); i++) {
            String prefix = s.substring(0, i);
            if (map.values().contains(prefix)) {
                continue;
            }
            map.put(ptn.charAt(0), prefix);
            if (dfs(ptn.substring(1), s.substring(prefix.length()), map)) {
                return true;
            }
            map.remove(ptn.charAt(0));
        }
        return false;
    }
}

results matching ""

    No results matching ""