Leetcode 290:单词模式(最详细解决方案!!!)

给定一种 pattern(模式) 和一个字符串 str ,判断 str 是否遵循相同的模式。

这里的遵循指完全匹配,例如, pattern 里的每个字母和字符串 str 中的每个非空单词之间存在着双向连接的对应模式。

示例1:

输入: pattern = "abba", str = "dog cat cat dog"
输出: true

示例 2:

输入:pattern = "abba", str = "dog cat cat fish"
输出: false

示例 3:

输入: pattern = "aaaa", str = "dog cat cat dog"
输出: false

示例 4:

输入: pattern = "abba", str = "dog dog dog dog"
输出: false

说明:
你可以假设 pattern 只包含小写字母, str 包含了由单个空格分隔的小写字母。

解题思路

我们首先想到的思路就是通过map建立两个字符串之间的映射,但是这种做法是不合理的,因为map建立的是一种多对一的映射,而题目的意思是要建立一种一对一的映射。我们手上有什么工具可以建立这种一对一的映射呢?现成的东西没有,我们可以通过两个map实现。

class Solution:
    def wordPattern(self, pattern, str_):
        """
        :type pattern: str
        :type str: str
        :rtype: bool
        """
        str_map1, str_map2 = {}, {}
        str_list = str_.split(' ')

        str_list_len = len(str_list)
        p_list_len = len(pattern)
        if str_list_len != p_list_len:
            return False

        for i in range(p_list_len):
            if str_map1.get(pattern[i]) != str_map2.get(str_list[i]):
                return False
            str_map1[pattern[i]] = str_map2[str_list[i]] = i
        return True

实际上我们是通过建立如下的映射关系实现的。

a -> 0 <- dog
b -> 1 <- cat
b -> 2 <- cat  
a -> 3 <- dog  True

a -> 0 <- dog
a -> 1 <- cat  False        get(a) == 0 and get(cat) == None
a -> 2 <- cat  
a -> 3 <- dog

我们也可以通过(setzip)组合的方式实现,非常pythonic

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

该问题的其他语言版本添加到了我的GitHub Leetcode

如有问题,希望大家指出!!!

猜你喜欢

转载自blog.csdn.net/qq_17550379/article/details/80586058
今日推荐