290. Word Pattern [easy] (Python)

来源:互联网 发布:各国战争潜力知乎 编辑:程序博客网 时间:2024/06/06 12:33

题目链接

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

0 0