资讯专栏INFORMATION COLUMN

890-查找和替换模式

haobowd / 1933人阅读

摘要:前言的的题目查找和替换模式,原题目描述如下你有一个单词列表和一个模式,你想知道中的哪些单词与模式匹配。如果存在字母的排列,使得将模式中的每个字母替换为之后,我们就得到了所需的单词,那么单词与模式是匹配的。

前言

LeetCode的Weekly Contest 98的题目查找和替换模式,原题目描述如下:

你有一个单词列表 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 映射到同一个字母。

解题思路

这道题目其实就是需要用一个数据结构去描述单词和模式之间的映射关系,而且模式和单词中的字母的关系是一对一,所以可以直接使用Map去解决这个问题。

实现代码
    /**
     * 查找和替换模式
     * @param words
     * @param pattern
     * @return
     */
    public List findAndReplacePattern(String[] words, String pattern) {
        List result = new ArrayList<>();
        char[] patternChars = pattern.toCharArray();
        for (String word : words) {
            char[] wordChars = word.toCharArray();
            //是否匹配
            boolean match = true;
            //用于存储映射关系的Map
            Map map = new HashMap<>();
            for (int i = 0; i < patternChars.length; i++) {
                char p = patternChars[i];
                char w = wordChars[i];
                if (map.containsKey(p)) {//模式中的字母是否已经映射已经被映射
                    char value = map.get(p);
                    if (value != w) {
                        match = false;
                        break;
                    }
                } else {
                    if(map.containsValue(w)){//判断单词中的字母是否被映射,防止模式多个字母都映射单词中的同一个字母
                        match = false;
                        break;
                    }else {
                        map.put(p, w);
                    }
                }
            }
            if (match) {
                result.add(word);
            }
        }
        return result;
    }

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/76797.html

相关文章

  • Javascript 正则表达式

    摘要:正则表达式对象通过内置对象支持正则表达式。做法很简单,就是在量词后添加一个即可分组分组或分组取值前瞻正则表达式是从文本头部向尾部解析。 正则表达式 REGEXP对象 javascript通过内置对象Regexp支持正则表达式。 两种方法来创建Regexp对象。 1、字面量 var reg = /d{4}/g; // g 表示进行全局替换 2、构造函数 var reg = new R...

    woshicixide 评论0 收藏0
  • 【Python3】基本数据类型-字符串(str)

    摘要:字符串常用功能移除空白分割长度索引切片下面来详细介绍下字符串首字母大写将所有大写变小写支持多种国家语言将大写变成小写只支持英文文本居中参数表示总长度参数空白处填充的字符长度为左右填充,包含自身长度表示传入之在字符串中出现的次数参数要查找的值 字符串常用功能: 移除空白 分割 长度 索引 切片 下面来详细介绍下 ~ capitalize 字符串首字母大写 name = xmzncc ...

    Awbeci 评论0 收藏0
  • JavaScript正则进阶之路——活学妙用奇淫正则表达式

    摘要:正则大法好,正则大法好,正则大法好,重要的事情说三遍。第二部分,这个部分是整个表达式的关键部分。学习正则如果还没有系统学习正则表达式,这里提供一些网上经典的教程供大家学习。正则表达式使用单个字符串来描述匹配一系列匹配某个句法规则的字符串。 原文收录在我的 GitHub博客 (https://github.com/jawil/blog) ,喜欢的可以关注最新动态,大家一起多交流学习,共同...

    BearyChat 评论0 收藏0
  • JavaScript正则进阶之路——活学妙用奇淫正则表达式

    摘要:正则大法好,正则大法好,正则大法好,重要的事情说三遍。第二部分,这个部分是整个表达式的关键部分。学习正则如果还没有系统学习正则表达式,这里提供一些网上经典的教程供大家学习。正则表达式使用单个字符串来描述匹配一系列匹配某个句法规则的字符串。 原文收录在我的 GitHub博客 (https://github.com/jawil/blog) ,喜欢的可以关注最新动态,大家一起多交流学习,共同...

    APICloud 评论0 收藏0

发表评论

0条评论

haobowd

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<