力扣290(java)-单词规律(简单)
题目:
给定一种规律 pattern 和一个字符串 s ,判断 s 是否遵循相同的规律。
这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 s 中的每个非空单词之间存在着双向连接的对应规律。
示例1:
输入: pattern = "abba", s = "dog cat cat dog"
输出: true
示例 2:
输入:pattern = "abba", s = "dog cat cat fish"
输出: false
示例 3:
输入: pattern = "aaaa", s = "dog cat cat dog"
输出: false
提示:
- 1 <= pattern.length <= 300
- pattern 只包含小写英文字母
- 1 <= s.length <= 3000
- s 只包含小写英文字母和 ' '
- s 不包含 任何前导或尾随对空格
- s 中每个单词都被 单个空格 分隔
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/word-pattern
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
参考@蓝色北半球的题解
题中的双向连接:
如果是从pattern到str的单向连接的话:那么意味着"a"只对应着"dog",但"dog"就可以对应多个字符,它可能除了"a"之外也对应着别的字符。因此,abba与"dog dog dog dog"符合单向连接的对应规律。在这里a只对应"dog",但"dog"同时对应着"a"和"b";
而双向连接意味着,"a"只对应着"dog",且"dog"也只对应着"a",因此在双向连接的对应规律下,上述的abba与"dog dog dog dog"是匹配失败的,只有abba与"dog cat cat dog"这种可以匹配成功。
使用HashMap+HashSet:
1.先将给定的s以空格为分隔符,分割成单个字符串,存放在字符串数组strs中。例如:将"dog cat cat dog"分隔成["dog", "cat", "cat", "dog"]
2.再准备一个哈希表map,哈希表的key记录着pattern中的字符,哈希表的value记录着strs数组中的字符串;
3.再准备一个hashSet,来存放strs中的单词(无重复),用来保证每个单词所对应的pattern字符是唯一的;
4.首先判断pattern的长度是否与字符串数组strs的长度相等,不相等,直接返回false;
5.然后遍历字符串pattern,对于每一个位置i:
如果map之前加入过pattern[i]这个key,那么只需要检查这个key对应的value是否与str[i]相等即可;
如果map中之前没加入过pattern[i]这个key:
但是set中已经有了arr[i]这个单词,说明arr[i]这个value不止和当前的key对应,它曾经也和别的key对应过,不符合题目中要求的双向连接的规律,返回false;
否则,把pattern[i]和arr[i]这二者的对应关系加入map。
java代码:
1 class Solution {
2 public boolean wordPattern(String pattern, String s) {
3 //以空格为分隔符进行分割
4 String[] strs = s.split(" ");
5 //如果两个字符串长度不一样一定不匹配
6 if (pattern.length() != strs.length) return false;
7 Map<Character, String> map = new HashMap<>();
8 HashSet<String> set = new HashSet<>();
9 for(int i = 0; i < pattern.length(); i++){
10 char c = pattern.charAt(i);
11 if(map.containsKey(c)){
12 //如果当前key,就判断value与当前单词是否匹配
13 if(!map.get(c).equals(strs[i])){
14 return false;
15 }
16 }else{
17 //如果map中还没有c这个key,但是已经有strs[i]这个value
18 //说明strs[i]这个value之前已经和别的key对应过
19 //这就不符合双向连接
20 if(set.contains(strs[i])){
21 return false;
22 }
23
24 map.put(c, strs[i]);
25 set.add(strs[i]);
26 }
27 }
28 return true;
29 }
30 }

力扣290(java)-单词规律(简单)的更多相关文章
- 力扣485. 最大连续1的个数-C语言实现-简单题
题目 [题目传送门] 给定一个二进制数组, 计算其中最大连续1的个数. 示例 1: 输入: [1,1,0,1,1,1] 输出: 3 解释: 开头的两位和最后的三位都是连续1,所以最大连续1的个数是 3 ...
- Java实现 LeetCode 290 单词规律
290. 单词规律 给定一种规律 pattern 和一个字符串 str ,判断 str 是否遵循相同的规律. 这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 str 中的每个非 ...
- LeetCode 290. 单词规律(Word Pattern) 41
290. 单词规律 290. Word Pattern 题目描述 给定一种规律 pattern 和一个字符串 str,判断 str 是否遵循相同的规律. 这里的 遵循 指完全匹配,例如,pattern ...
- 力扣832. 翻转图像-C语言实现-简单题
题目 传送门 文本 给定一个二进制矩阵 A,我们想先水平翻转图像,然后反转图像并返回结果. 水平翻转图片就是将图片的每一行都进行翻转,即逆序.例如,水平翻转 [1, 1, 0] 的结果是 [0, 1, ...
- 力扣566. 重塑矩阵-C语言实现-简单题
题目 传送门 在MATLAB中,有一个非常有用的函数 reshape,它可以将一个矩阵重塑为另一个大小不同的新矩阵,但保留其原始数据. 给出一个由二维数组表示的矩阵,以及两个正整数r和c,分别表示想要 ...
- 力扣算法经典第一题——两数之和(Java两种方式实现)
一.题目 难度:简单 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数, 并返回它们的数组下标. 你可以假设每种输入只会对应一 ...
- 力扣561. 数组拆分 I-C语言实现-简单题
题目 传送门 给定长度为 2n 的整数数组 nums ,你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), ..., (an, bn) ,使得从 1 到 n 的 min(a ...
- 力扣896. 单调数列-C语言实现-简单题
题目 传送门 文本 如果数组是单调递增或单调递减的,那么它是单调的. 如果对于所有 i <= j,A[i] <= A[j],那么数组 A 是单调递增的. 如果对于所有 i <= j, ...
- 力扣算法题—069x的平方根
实现 int sqrt(int x) 函数. 计算并返回 x 的平方根,其中 x 是非负整数. 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去. 示例 1: 输入: 4 输出: 2 示例 ...
- LeetCode874 模拟行走机器人(简单模拟—Java之HashSet简单应用)
题目: 机器人在一个无限大小的网格上行走,从点 (0, 0) 处开始出发,面向北方.该机器人可以接收以下三种类型的命令: -2:向左转 90 度-1:向右转 90 度1 <= x <= 9 ...
随机推荐
- WOX 和 everything 差不多,挺不错也
WOX 和 everything 差不多,挺不错也
- linux程序运行结果在打印到屏幕的同时写入文件
1.使用script工具 script工具是一个非常使用的工具,可以把输出到终端的信息记录下来.使用方法如: (1)输入 script log.txt命令开始保存终端输出的信息 ,其中log.txt为 ...
- python计算二进制bin文件hash值
一 hash的价值 hash值的唯一性仅仅在是同一个文件的情况下得到了同样的hash值,而哪怕错误一个字节也会得到不一样的hash值. hash值得最大价值就是唯一性.这样在bin文件检查和校验这块用 ...
- Spring Boot学习日记12
学习了Thymeleaf模板引擎前端交给我们的页面,是html页面.如果是我们以前开发,我们需要把他们转成jsp页面,jsp好处就是当我们查出一些数据转发到JSP页面以后,我们可以用jsp轻松实现数据 ...
- UE干货| UE虚幻引擎调试神器—控件反射器
一.打开控件反射器 可以通过窗口→开发者工具→控件反射器 打开: 也可以在umg编辑器上方控件反射器打开. 二.UE控件反射器使用方法 运行项目后,点击控件反射器的"选择可测试命中控件&qu ...
- Android保存多张图片到本地
目录介绍 01.实际开发保存图片遇到的问题 02.直接用http请求图片并保存本地 03.用glide下载图片保存本地 04.如何实现连续保存多张图片 05.关于其他介绍 好消息 博客笔记大汇总[16 ...
- 记录--通过手写,分析async await核心原理
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 async await 语法是 ES7出现的,是基于ES6的 promise和generator实现的 generator函数 在之 ...
- 记一次查询优化,mybatis查询oracle卡,直接拿sql数据库查询很快
调整前 <select id="getList" resultMap="BaseResultMap" parameterType="java.u ...
- BeanUtils.copyProperties() 详解
BeanUtils.copyProperties会进行类型转换:BeanUtils.copyProperties方法简单来说就是将两个字段相同的对象进行属性值的复制. 如果 两个对象之间存在名称不相同 ...
- #扫描线,线段树#nssl 1459 空间复杂度
分析 由于\(k\leq 10\)所以考虑用总方案减去经过两个差的绝对值\(\leq k\)的点的路径数 分类讨论一下发现要处理祖先关系和其它关系两种情况,考虑怎么去重,可以将这些答案看作一个个矩形, ...