LeetCode每日一题——890. 查找和替换模式

简介: 你有一个单词列表 words 和一个模式 pattern,你想知道 words 中的哪些单词与模式匹配。

题目

你有一个单词列表 words 和一个模式 pattern,你想知道 words 中的哪些单词与模式匹配。

如果存在字母的排列 p ,使得将模式中的每个字母 x 替换为 p(x) 之后,我们就得到了所需的单词,那么单词与模式是匹配的。

(回想一下,字母的排列是从字母到字母的双射:每个字母映射到另一个字母,没有两个字母映射到同一个字母。)

返回 words 中与给定模式匹配的单词列表。

你可以按任何顺序返回答案。

示例

输入:words = [“abc”,“deq”,“mee”,“aqq”,“dkd”,“ccc”], pattern = “abb”

输出:[“mee”,“aqq”]

解释: “mee” 与模式匹配,因为存在排列 {a -> m, b -> e, …}。 "ccc"与模式不匹配,因为 {a -> c, b -> c, …} 不是排列。 因为 a 和 b 映射到同一个字母。

提示:

1 <= words.length <= 50

1 <= pattern.length = words[i].length <= 20

思路

本题考串的模式匹配问题,本题的具体要求是要从给定的字符串列表words中找出形式和给定字符串pattern格式相同的字符串集合,如pattern = ‘abc’, 从words中找到的与之相匹配的字符串也必须是三个字符各不相同的字符串如’bac’,‘xyz’等,又比如pattern = ‘aba’, 从words中找到的与之相匹配的字符串也必须是相同位置相等的字符串如’xyx’,'bab’等。因为题中所给words中字符都和pattern等长,所以具体解题可分为两种情况:

1.给定pattern长度为1,words中的字符都和pattern模式相同,直接返回words

2.给定pattern长度大于1,首先遍历pattern将其格式记录于哈希表里(从第二位开始向前面的每一位比较,生成一个布尔数组,放在哈希表里待使用),然后遍历words中的每个字符串,使用和上面同样的方法从第二位开始向前面的每一位比较,生成一个布尔数组,然后和哈希表中的数组结果相比较,如果全部相等则为答案。

题解

def findAndReplacePattern(words: List[str], pattern: str) -> List[str]:
  # 情况1
    if len(pattern) == 1:
        return words
    # 情况2
    # 哈希表
    temp = {}
    res = []
    for i in range(1, len(pattern)):
        ans = []
        # 每一位朝前比较
        for j in range(1, i+1):
            if pattern[i] == pattern[i-j]:
                ans.append(True)
            else:
                ans.append(False)
        # 每一位朝前比较的布尔数组存于哈希表中
        temp[i] = ans
    for i in words:
      # index记录当前比较的字符串中布尔数组和哈希表中布尔数组相同的个数
        index = 0
        for j in range(1, len(i)):
            use = []
            # 同样的方法每一位朝前比较
            for k in range(1, j+1):
                if i[j] == i[j-k]:
                    use.append(True)
                else:
                    use.append(False)
            if use == temp[j]:
                index += 1
        #  如果布尔数组和哈希表中的全部相等,加入答案
        if index == len(i) - 1:
            res.append(i)
    return res
目录
相关文章
|
7月前
|
算法 测试技术 C#
【动态规划】LeetCode2552:优化了6版的1324模式
【动态规划】LeetCode2552:优化了6版的1324模式
|
7月前
|
算法 测试技术 C++
【动态规划】LeetCode2552:优化了6版的1324模式
【动态规划】LeetCode2552:优化了6版的1324模式
|
算法 PHP
力扣(LeetCode)算法题解:1299. 将每个元素替换为右侧最大元素
力扣(LeetCode)算法题解:1299. 将每个元素替换为右侧最大元素
140 0
LeetCode每日一题-9:替换后的最长重复字符串
LeetCode每日一题-9:替换后的最长重复字符串
|
自然语言处理
LeetCode每日一题——648. 单词替换
在英语中,我们有一个叫做 词根(root) 的概念,可以词根后面添加其他一些词组成另一个较长的单词——我们称这个词为 继承词(successor)。例如,词根an,跟随着单词 other(其他),可以形成新的单词 another(另一个)。
116 0
|
机器学习/深度学习 自然语言处理 算法
每日算法系列【LeetCode 424】替换后的最长重复字符
给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次。在执行上述操作后,找到包含重复字母的最长子串的长度。
181 0
每日算法系列【LeetCode 424】替换后的最长重复字符
|
算法
​LeetCode刷题实战397:整数替换
算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !
133 0
 ​LeetCode刷题实战397:整数替换
|
数据库
LeetCode(数据库)- 使用唯一标识码替换员工ID
LeetCode(数据库)- 使用唯一标识码替换员工ID
125 0
LeetCode——替换后的最长重复字符(滑动窗口)
LeetCode——替换后的最长重复字符(滑动窗口)
127 0
LeetCode——替换后的最长重复字符(滑动窗口)
|
算法
​LeetCode刷题实战424:替换后的最长重复字符
算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !
125 0