291. 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 word in str.

Examples:

  • pattern = "abba", str = "redblueredblue" should return true.
  • pattern = "aaaa", str = "asdasdasdasd" should return true.
  • pattern = "aabb", str = "xyzabcxzyabc" should return false.

Notes:

You may assume pattern and str contain only lowercase letters.

Solution: HashMap & DFS

class Solution(object):
    def wordPatternMatch(self, pattern, str):
        """
        :type pattern: str
        :type str: str
        :rtype: bool
        """
        char_word = dict()
        word_char = dict()
        pat_len = len(pattern)
        str_len = len(str)

        def dfs(i, j):
            if i == pat_len and j == str_len:
                return True
            if i >= pat_len or j >= str_len or pat_len - i > str_len - j:
                return False

            char = pattern[i]
            if char in char_word:
                word = char_word[char]
                k = j + len(word)
                if str.find(word, j, k) != -1:
                    return dfs(i + 1, k)
                return False

            for k in xrange(j, len(str)):
                word = str[j: k + 1]
                if word in word_char:
                    continue
                char_word[char] = word
                word_char[word] = char
                if dfs(i + 1, k + 1):
                    return True
                del char_word[char]
                del word_char[word]
            return False

        return dfs(0, 0)

Lessons:

  • When pattern length is larger than string length, simply return false.

results matching ""

    No results matching ""