【leetcode】单词规律

单词规律

问题描述
在这里插入图片描述

字典解法

class Solution:
    def wordPattern(self, pattern: str, str: str) -> bool:
        a={}
        p=list(pattern)
        q=str.split(" ")
        if len(p)!=len(q):
            return False
        elif(len(set(p))!=len(set(q))):
            return False
        else:
            for i in range(len(p)):
                if p[i] not in a:
                    a[p[i]]=q[i]
                else:
                    if a[p[i]]!=q[i]return False
            if len(set(a.keys()))==len(set(a.values())):
                return  True
            else:   
                return False

在这里插入图片描述
tips:
1.zip()和zip(* )
zip()可以将对象中对应的元素打包成一个个元组
zip(*)可以理解为解压
在这里插入图片描述
借用zip
把pattern和str的对应元素打包成元组,再变为几个,解压后两个里面的值应该都是无重复且长度相等。

class Solution:
    def wordPattern(self, pattern: str, str: str) -> bool:
        if len(str.split(" ")) != len(list(pattern)):
            return False
        for l in zip(*set(zip(list(pattern), str.split(" ")))):
            if len(l) != len(set(l)):
                return False
        return True

在这里插入图片描述
也可以不解压,pattern的集合的长度应该等于str的集合的长度等于zip后的集合的长度。

时间复杂度减小

class Solution:
    def wordPattern(self, pattern: str, str: str) -> bool:
        s1=str.split(' ')
        if len(pattern) != len(s1):
            return False
        if len(set(zip(list(pattern),s1)))==len(set(s1))==len(set(pattern)):
            return True
        else:
            return False

在这里插入图片描述

class Solution:
    def wordPattern(self, pattern: str, str: str) -> bool:

        res=str.split()
        return list(map(pattern.index, pattern))==list(map(res.index,res))


map() .index
map() 会根据提供的函数对指定序列做映射。

第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。
list.index则是对每个元素进行寻找该元素的索引位置。

class Solution:
    def wordPattern(self, pattern: str, str: str) -> bool:
        res=str.split()
        return list(map(pattern.index, pattern))==list(map(res.index,res))


在这里插入图片描述
abba逐个元素找索引位置即为0110
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值