一、题目描述

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

二、输入输出描述

  1、示例:

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

  2、提示:

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

三、思路

四、代码

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

 package cn.zifuchuan;

 import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; public class Test1 { /*
* words = ["abc","deq","mee","aqq","dkd","ccc"], pattern = "abc"
*/
public static void main(String[] args) {
String[] words = {"abcc","deqq","meee","aqq","dkd","ccc"};
String pattern = "abcc";
System.out.println(findAndReplacePattern(words, pattern)); } /**
* @param words 输入的字符串
* @param pattern 找到符合这个形式的字符串
* @return
*/
public static List<String> findAndReplacePattern(String[] words, String pattern) {
List<String> res = new ArrayList<>();
Map<Character, Character> map = new HashMap<>();
for (String word : words) {
//先简单的判断长度
if (word.length() != pattern.length())
continue;
boolean flag = true; //判断当前是不是和pattern形式一样的字符串
for (int i = 0; i < word.length(); i++) {
/*
* containsKey
* boolean containsKey(Object key)如果此映射包含指定键的映射关系,则返回 true。
* 更确切地讲,当且仅当此映射包含针对满足 (key==null ? k==null : key.equals(k)) 的键 k 的映射关系时,
* 返回 true。(最多只能有一个这样的映射关系)。
*/
/*
* containsValue
* boolean containsValue(Object value)如果此映射将一个或多个键映射到指定值,则返回 true。
* 更确切地讲,当且仅当此映射至少包含一个对满足 (value==null ? v==null : value.equals(v)) 的值 v 的映射关系时,
* 返回 true。对于大多数 Map 接口的实现而言,此操作需要的时间可能与映射大小呈线性关系。
*/
/*
* 1、首先需要将pattern字符串的各个字符作为key值添加到map中
* 判断是否存在这个key值,如果存在这个key值那么判断对应的value值是不是相等
*/
if (map.containsKey(pattern.charAt(i))) { //有这个键值
//abcc
//deqq
//比如上面,map.get(c)=q, word.charAt(3)=q,满足条件
if (map.get(pattern.charAt(i)) != word.charAt(i)) { //判断当key值相同的时候,value是否相等
flag = false;
break;
}
} else { //不包含关键字的时候
if (map.containsValue(word.charAt(i))) { //不存在关键字,但是已经存在键值映射,就不符合给定的字符串模式
/*abcc
meee
上面的这种:首先会将a-m、b-e加入map中,然后第三次判断,键c不存在,
但是值e已经存在,这是不符合的所以需要剔除这种情况
*/
flag = false;
break;
}
//pattern中的每个字符作为key值,word中的对应的字符作为value值
map.put(pattern.charAt(i), word.charAt(i));
}
}
if (flag)
res.add(word);
map.clear();
}
return res;
}
}

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. jsp中一个标签两种方式绑定两个click事件导致未执行的问题

    近日,在开发过程中,写了一个标签 <li id="a1" onclick="doSomething()">...</li> 在js页面中 ...

  2. Scyther-manual ------BNF

    1.Scyther 协议安全模型的验证实例 第一部分:  打开协议模型 ,设置攻击变量的参数执行分析 Scyther  is a tool for the formal analysis o the ...

  3. linux统配符

    linux通配符注意:linux的通配符和三剑客的表达式是不一样的,因为,代表的意义是有较大区别的.通配符一般用户命令行bash环境,而linux正则表达式用于grep,sed,awk场景. *    ...

  4. wx:for获取 data-xxx 自定义的属性

    今天在写wx:for循环时,在事件对象上e.target.dataset上一直拿不到自定义属性 data-id. 示例: <view wx:for='{{list}}' wx:key='{{it ...

  5. 【玩转开源】基于Docker搭建Bug管理系统 MantisBT

    环境Ubuntu18.04 + Docker 1. Docker Hub 链接:https://hub.docker.com/r/vimagick/mantisbt 这里直接使用docker命令的方式 ...

  6. 设置Jexus开机启动

    一.如需要开机没有登陆情况下就能运行的程序,存在系统服务(system)里,即:/lib/systemd/system/  ,服务以.service结尾 cd /lib/systemd/system/ ...

  7. [转] JavaScript中in操作符(for..in)、Object.keys()和Object.getOwnPropertyNames()的区别

    ECMAScript将对象的属性分为两种:数据属性和访问器属性.每一种属性内部都有一些特性,这里我们只关注对象属性的[[Enumerable]]特征,它表示是否通过 for-in 循环返回属性,也可以 ...

  8. 物联网框架ServerSuperIO.Core(.netcore)跨平台,一套设备驱动通吃嵌入式、上位机、云服务

    1.      概述... 2 2.      ServerSuperIO.Core跨平台开发环境... 2 3.      ServerSuperIO.Core特点... 2 4.      Ser ...

  9. EF|CodeFirst数据并发管理

    在项目开发中,我们有时需要对数据并发请求进行处理.举个简单的例子,比如接单系统中,AB两个客服同时请求处理同一单时,应该只有一单请求是处理成功的,另外一单应当提示客服,此单已经被处理了,不需要再处理. ...

  10. 【WPF开发备忘】使用MVVM模式开发中列表控件内的按钮事件无法触发解决方法

    实际使用MVVM进行WPF开发的时候,可能会用到列表控件中每行一个编辑或删除按钮,这时直接去绑定,发现无法响应: <DataGridTemplateColumn Header="操作& ...