Leetcode290 单词规律

题目描述

file

我的解法

class Solution:
    def wordPattern(self, pattern: str, str: str) -> bool:
        if not str or not pattern:
            return False
        arr = str.split(" ")
        if len(arr)!= len(pattern):
            return False
        flag = [[] for _ in range(26)]
        self.tmp = ' '
        for index,letter in enumerate(pattern):
            flag[ord(letter)-97].append(index)
        for i in range(len(flag)):
            if flag[i]:
                if(self.tmp==arr[flag[i][0]]):
                    return False
                self.tmp = arr[flag[i][0]]
                for j in range(0,len(flag[i])-1):
                    if arr[flag[i][j]]!=arr[flag[i][j+1]]:
                        return False
        return True
 

神仙解法

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

Note

  • 开数组遍历的解法思想比较简单。看我的代码应该是其义自明的。。(虽然很丑。。。)
  • 神仙解法解释一下 主要是用map()函数做映射 然后转成列表判断是否一致就可以了
>>> pattern = "abba"
>>> str = "dog cat cat dog"
>>> res = str.split()
["dog","cat","cat","dog"]
>>> list(map(pattern.index,pattern))
[0, 1, 1, 0]
>>> list(map(res.index,res))
[0, 1, 1, 0]

可以看到map函数根据字符串或者列表来打印出自己想要的映射,这里依据索引值做映射都以第一次遇到该元素的时候为映射值。当然也可以以其他square、count等等做映射