一、题目描述

你有一个单词列表 words 和一个模式  pattern,你想知道 words 中的哪些单词与模式匹配。如果存在字母的排列 p ,使得将模式中的每个字母 x 替换为 p(x) 之后,我们就得到了所需的单词,那么单词与模式是匹配的。(回想一下,字母的排列是从字母到字母的双射:每个字母映射到另一个字母,没有两个字母映射到同一个字母。)返回 words 中与给定模式匹配的单词列表。你可以按任何顺序返回答案。

二、输入输出描述

  1、示例:

  1. 输入:words = ["abc","deq","mee","aqq","dkd","ccc"], pattern = "abb"
  2. 输出:["mee","aqq"]
  3. 解释:
  4. "mee" 与模式匹配,因为存在排列 {a -> m, b -> e, ...}。
  5. "ccc" 与模式不匹配,因为 {a -> c, b -> c, ...} 不是排列。
  6. 因为 a b 映射到同一个字母。 

  2、提示:

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

三、思路

四、代码

  根据上面的思路,使用map实现

  1. package cn.zifuchuan;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.HashMap;
  5. import java.util.List;
  6. import java.util.Map;
  7.  
  8. public class Test1 {
  9.  
  10. /*
  11. * words = ["abc","deq","mee","aqq","dkd","ccc"], pattern = "abc"
  12. */
  13. public static void main(String[] args) {
  14. String[] words = {"abcc","deqq","meee","aqq","dkd","ccc"};
  15. String pattern = "abcc";
  16. System.out.println(findAndReplacePattern(words, pattern));
  17.  
  18. }
  19.  
  20. /**
  21. * @param words 输入的字符串
  22. * @param pattern 找到符合这个形式的字符串
  23. * @return
  24. */
  25. public static List<String> findAndReplacePattern(String[] words, String pattern) {
  26. List<String> res = new ArrayList<>();
  27. Map<Character, Character> map = new HashMap<>();
  28. for (String word : words) {
  29. //先简单的判断长度
  30. if (word.length() != pattern.length())
  31. continue;
  32. boolean flag = true; //判断当前是不是和pattern形式一样的字符串
  33. for (int i = 0; i < word.length(); i++) {
  34. /*
  35. * containsKey
  36. * boolean containsKey(Object key)如果此映射包含指定键的映射关系,则返回 true。
  37. * 更确切地讲,当且仅当此映射包含针对满足 (key==null ? k==null : key.equals(k)) 的键 k 的映射关系时,
  38. * 返回 true。(最多只能有一个这样的映射关系)。
  39. */
  40. /*
  41. * containsValue
  42. * boolean containsValue(Object value)如果此映射将一个或多个键映射到指定值,则返回 true。
  43. * 更确切地讲,当且仅当此映射至少包含一个对满足 (value==null ? v==null : value.equals(v)) 的值 v 的映射关系时,
  44. * 返回 true。对于大多数 Map 接口的实现而言,此操作需要的时间可能与映射大小呈线性关系。
  45. */
  46. /*
  47. * 1、首先需要将pattern字符串的各个字符作为key值添加到map中
  48. * 判断是否存在这个key值,如果存在这个key值那么判断对应的value值是不是相等
  49. */
  50. if (map.containsKey(pattern.charAt(i))) { //有这个键值
  51. //abcc
  52. //deqq
  53. //比如上面,map.get(c)=q, word.charAt(3)=q,满足条件
  54. if (map.get(pattern.charAt(i)) != word.charAt(i)) { //判断当key值相同的时候,value是否相等
  55. flag = false;
  56. break;
  57. }
  58. } else { //不包含关键字的时候
  59. if (map.containsValue(word.charAt(i))) { //不存在关键字,但是已经存在键值映射,就不符合给定的字符串模式
  60. /*abcc
  61. meee
  62. 上面的这种:首先会将a-m、b-e加入map中,然后第三次判断,键c不存在,
  63. 但是值e已经存在,这是不符合的所以需要剔除这种情况
  64. */
  65. flag = false;
  66. break;
  67. }
  68. //pattern中的每个字符作为key值,word中的对应的字符作为value值
  69. map.put(pattern.charAt(i), word.charAt(i));
  70. }
  71. }
  72. if (flag)
  73. res.add(word);
  74. map.clear();
  75. }
  76. return res;
  77. }
  78. }

leetcode-查找和替换模式的更多相关文章

  1. [LeetCode] 890. Find and Replace Pattern 查找和替换模式

    You have a list of words and a pattern, and you want to know which words in words matches the patter ...

  2. leetcode 890. 查找和替换模式 Python

    用模式的每个字母去当做key对应单词列表的每个字母value, 如果放进dict之前检测到key已经存在,就检测Word[i][j]是否是和已经存在的value一致,不一致就代表不匹配,break检查 ...

  3. [Swift]LeetCode890. 查找和替换模式 | Find and Replace Pattern

    You have a list of words and a pattern, and you want to know which words in words matches the patter ...

  4. [LeetCode] Find And Replace in String 在字符串中查找和替换

    To some string S, we will perform some replacement operations that replace groups of letters with ne ...

  5. Linux中在vim/vi模式下对文本的查找和替换

    查找: 1.vim  filename  进入一般模式下 2.查找和替换方法 /word    向下查找word 的字符串  例如  /chengtingting   向下查找字符chengtingt ...

  6. Java实现 LeetCode 833 字符串中的查找与替换(暴力模拟)

    833. 字符串中的查找与替换 对于某些字符串 S,我们将执行一些替换操作,用新的字母组替换原有的字母组(不一定大小相同). 每个替换操作具有 3 个参数:起始索引 i,源字 x 和目标字 y.规则是 ...

  7. 在VIM中进行快速的查找和替换

    VIM是被誉为非常高效的文本编辑软件.但是掌握并高效的使用是件有难度的事情.在VIM中进行快速的查找和替换是提高VIM使用效率的重要方法.下面是我在阅读VIM用户手册时整理的一些资料: 行内搜索. f ...

  8. vi的查找与替换

    0x01 查找 (在命令行模式下) /<要查找的字符>   向下查找要查找的字符 ?<要查找的字符>   向上查找要查找的字符 0x02 替换 (在底行模式下) :0,$s/s ...

  9. 【python cookbook】【字符串与文本】5.查找和替换文本

    问题:对字符串中的文本做查找和替换 解决方案: 1.对于简单模式:str.replace(old, new[, max]) 2.复杂模式:使用re模块中的re.sub(匹配的模式, newstring ...

  10. sed 文件查找,替换

    sed 命令查找与替换: (1)删除第2,3行:sed '2,3d' test.txt > new.txt (2)替换:  替换所有:sed 's/abc/ABC/' test.txt > ...

随机推荐

  1. selenium对百度进行登录注销

    #百度登录退出demo import time from selenium import webdriver from selenium.webdriver.common.action_chains ...

  2. SpringBoot的自动配置

    1.根据条件来装配bean,SpringBoot的自动配置,根据条件进行自动配置. 首先创建一个接口,如下所示: package com.bie.encoding; /** * * @Descript ...

  3. Java实现基于token认证

    随着互联网的不断发展,技术的迭代也非常之快.我们的用户认证也从刚开始的用户名密码转变到基于cookie的session认证,然而到了今天,这种认证已经不能满足与我们的业务需求了(分布式,微服务).我们 ...

  4. BZOJ2759 一个动态树好题 LCT

    题解: 的确是动态树好题 首先由于每个点只有一个出边 这个图构成了基环内向树 我们观察那个同余方程组 一旦形成环的话我们就能知道环上点以及能连向环上点的值是多少了 所以我们只需要用一种结构来维护两个不 ...

  5. sql server managerment 给表加说明

    右击表 =>点属性  =>扩展属性 =>加 MS_Description

  6. 高性能HTTP加速器Varnish-3.0.3搭建、配置及优化步骤

    经过一天的努力,终于将Varnish缓存服务器部署到线上服务器了.趁着热乎劲儿,赶紧给大家分享一下.Varnish是一个轻量级的Cache和反向代理软件.先进的设计理念和成熟的设计框架是Varnish ...

  7. java PDF分页打印

    将获取的pdf文件按页拆分:参考https://q.cnblogs.com/q/99944/ pdf文件有多页,第一页需设置横向打印,其他页设置为纵向打印. PDDocument document = ...

  8. docker使用教程

    Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布到任何流行的 Li ...

  9. WPF使用总结

    ListboxItemContainer样式 一般items控件的项模板 很容易 设置DataTemplate就可以了,比如listbox .但是在选中和失去焦点的时候 却是Windows自带的那种 ...

  10. ubuntu/deepin 下 Sha 哈 dow 哈 socks 全局配置

    1. 安装编译环境 Ubuntu在默认情况下没有提供C/C++的编译环境,因此需要手动安装.如果单独安装gcc以及g++比较麻烦,为了方便,我们直接安装Ubuntu提供的build-essential ...