290. Word Pattern [easy] (Python)

Posted coder_orz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了290. Word Pattern [easy] (Python)相关的知识,希望对你有一定的参考价值。

题目链接

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

题目原文

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:

  1. pattern = “abba”, str = “dog cat cat dog” should return true.
  2. pattern = “abba”, str = “dog cat cat fish” should return false.
  3. pattern = “aaaa”, str = “dog cat cat dog” should return false.
  4. pattern = “abba”, str = “dog dog dog dog” should return false.

Notes:
You may assume pattern contains only lowercase letters, and str contains lowercase letters separated by a single space.

题目翻译

给定一个模式(pattern)和一个字符串(str),判断字符串是否匹配该模式。这里匹配指的是完全匹配,是pattern中的字符和str中的非空单词之间的双射。
这题与另一题非常类似,解法基本一致,可参看:
205. Isomorphic Strings

思路方法

思路一

同时遍历pattern的每个字符,和str中的每个word,建立它们的映射关系,当出现违背映射关系的情况时,可直接返回false。另外,由于是双射,pattern中的不同字符不能映射到相同的word,所以也要做这方面的检查。

代码

class Solution(object):
    def wordPattern(self, pattern, str):
        """
        :type pattern: str
        :type str: str
        :rtype: bool
        """
        words = str.split(' ')
        if len(words) != len(pattern):
            return False
        hashmap = {}
        mapval = {}
        for i in xrange(len(pattern)):
            if pattern[i] in hashmap:
                if hashmap[pattern[i]] != words[i]:
                    return False
            else:
                if words[i] in mapval:
                    return False
                hashmap[pattern[i]] = words[i]
                mapval[words[i]] = True
        return True

思路二

对于pattern和str,分别用一个数组记录每个字符或word第一次出现的位置。当同时遍历pattern和str时,如果发现它们在某一位置的字符或word第一次出现的位置不同,则返回false。

代码

class Solution(object):
    def wordPattern(self, pattern, str):
        """
        :type pattern: str
        :type str: str
        :rtype: bool
        """
        words = str.split(' ')
        if len(words) != len(pattern):
            return False
        return map(pattern.find, pattern) == map(words.index, words)

思路三

根据题目的描述,pattern有多少种不同的字符,str也有多少种不同的word。如果我们将映射写成字符对的形式,比如 (‘a’,’dog’) 表示pattern中字符’a’映射到str中’dog’,那么映射的个数与pattern中字符的种类数相同。
所以该方法本质上也是判断映射是不是双射。

代码

class Solution(object):
    def wordPattern(self, pattern, str):
        """
        :type pattern: str
        :type str: str
        :rtype: bool
        """
        words = str.split(' ')
        if len(words) != len(pattern):
            return False
        return len(set(pattern)) == len(set(words)) == len(set(zip(pattern, words)))

PS: 新手刷LeetCode,新手写博客,写错了或者写的不清楚还请帮忙指出,谢谢!
转载请注明:http://blog.csdn.net/coder_orz/article/details/51693647

以上是关于290. Word Pattern [easy] (Python)的主要内容,如果未能解决你的问题,请参考以下文章

leetcode290. Word Pattern

290. Word Pattern

290. Word Pattern

LeetCode_290. Word Pattern

[leetcode]290.Word Pattern

290. Word Pattern