持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第17天,点击查看活动详情
测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。
怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~
一、题目描述:
-
题目内容
-
题目示例
-
题目解析
1 <= words.length <= 501 <= pattern.length = words[i].length <= 20
二、思路分析:
我们认真读完本题,题目要求我们从words列表中求出与给定pattern模式一致的word。一看到,求解模式匹配的,我们之间也有刷到过类型的题目如205. 同构字符串,需要建立word和pattern映射关系。
在该题目的要求中,我们也需要明确如下几点信息💻:
- pattern字符串长度与words列表中的word长度一致
- pattern字符串与每一个word都需要建立双映射关系(筛选出相同字母的情况)
因此,解答本题的思路如下:
- 首先定义两个字典patternmap,wordmap,分别来存储pattern与word的映射关系
- patternmap 以 pattern[i] 为key,word[i]为value
- wordmap 以 word[i] 为key,pattern[i]为value
- 当 patternmap[paterrn[i]] != word[i] 或者 wordmap[word[i]] != pattern[i]时,则该word不符合pattern模式
因此,根据上述思路,我们使用python来实现代码如下:
class Solution(object):
def findAndReplacePattern(self, words, pattern):
"""
:type words: List[str]
:type pattern: str
:rtype: List[str]
"""
def pattermatch(word):
patternmap = {}
wordmap = {}
for i in range(len(pattern)):
if pattern[i] not in patternmap.keys():
patternmap[pattern[i]] = word[i]
if word[index] not in wordmap.keys():
wordmap[word[i]] = pattern[i]
if patternmap[pattern[i]] != word[i] or wordmap[word[i]] != pattern[i] :
return 0
return 1
ans = []
for i in range(len(words)):
if pattermatch(words[i]) == 1:
ans.append(words[i])
return ans
虽然,我们使用两个字典创建双映射表,能轻松实现题目中要求,但是空间复杂度大大降低了。
-
单哈希映射表
-
优化一
- 创建子涵数多增加一个参数,patternmatch(word,pattern)
- zip()函数帮助我们快速迭代多个序列
class Solution(object): def findAndReplacePattern(self, words, pattern): def patternmatch(word,pattern): mp = {} for w,p in zip(word,pattern): if w not in mp: mp[w] = p elif mp[w] != p: return False return True ans = [] for word in words: if patternmatch(word,pattern) and patternmatch(pattern,word): ans.append(word) return ans -
优化二,字符串归一化
- 将pattern字符串,通过统一计算转换成新字符串newp
- 同理将word字符串,也按相同的算法,计算出新字符串neww
- 比较newp和neww两个字符串相等,则符合要求,否则不符合
class Solution(object): def findAndReplacePattern(self, words, pattern): def patternmatch(word): cur = "a" mp = {} neww = "" for i in range(len(word)): if word[i] not in mp: mp[word[i]] = cur cur = chr(ord(cur)+1) neww += mp[word[i]] return neww ans = [] newp = patternmatch(pattern) for word in words: if patternmatch(word) == newp: ans.append(word) return ans -
优化三,通过字符串长度判断
- 通过set()集合元素对字符串pattern和word处理
- len(set(patten))== len(set(word))==len(set(zip(pattern,word)))
class Solution(object): def findAndReplacePattern(self, words, pattern): def patternmatch(word,pattern): return len(set(word)) == len(set(pattern)) == len(set(zip(word,pattern))) ans = [] for word in words: if patternmatch(word,pattern): ans.append(word) return ans
-
三、总结:
本题考察字符串双映射关系的处理,熟练掌握其对于关系我们可以轻松解决,AC提交记录如下:
- 时间复杂度O(mn),m为words的长度,n为pattern的长度
- 空间复杂度O(n),n为pattern的长度
以上是本期内容,欢迎大佬们点赞评论,下期见~~~