【LeetCode】890. 查找和替换模式

247 阅读3分钟

image.png

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第17天,点击查看活动详情

测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。

怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~

一、题目描述:

  • 题目内容

image.png

  • 题目示例

image.png

  • 题目解析

    • 1 <= words.length <= 50
    • 1 <= 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两个字符串相等,则符合要求,否则不符合 image.png
      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提交记录如下:

image.png

  • 时间复杂度O(mn),m为words的长度,n为pattern的长度
  • 空间复杂度O(n),n为pattern的长度

以上是本期内容,欢迎大佬们点赞评论,下期见~~~