力扣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 ...
随机推荐
- vscode 自动格式化 好使的配置 setting.json 20210622
一直用idea,今天有个需求得用vscode,发现格式化不好使了 用 vetur 格式化 结果带分行什么的,eslint 过去不了,更新了个好使的配置,记录一下. { "update.mod ...
- 关于黑客网络 for linux,这个游戏的启动解决方法
原帖位置https://tieba.baidu.com/p/6200215090
- 手撕fft算法--fft原理和源码解析
一 前言 在音频信号处理中,fft变换是一个无法绕过过去的存在.借着一次算法出来的机会,把fft熟悉一下不为过啊. 二 问题 这里,其实是由一个问题驱动的,那就是:怎么通过fft的变化来得 ...
- git 删除本地创建的仓库常用方法
基本方法 清除本地文件夹下的git文件,然后在重新初始化新建的git仓库 具体实施 //删除文件夹下的所有 .git 文件 find . -name ".git" | xarg ...
- 谈谈Redis五种数据结构及真实应用场景
前言 如果问你redis有哪些数据结构,你肯定可以一口气说出五种基本数据结构: String(字符串).Hash(哈希).List(列表).Set(集合).zset(有序集合) 你或许还知道它还有三种 ...
- python基础七(函数名称空间及作用域、函数对象、函数嵌套、闭包函数、装饰器)
一 名称空间(namespaces):存放名字的地方,是对栈区的划分. 有了名称空间之后,就可以在栈区中存放相同的名字,详细的名称空间.分三种1.1 内建名称空间存放的名字:存放的python解释器内 ...
- Python 合并Excel数据 (Excel文件单sheet)
一.Python批量合并Excel数据<方法1> import pandas as pd import glob import os # 使用glob.glob函数获取指定目录下所有以.x ...
- 关于SQL Server数据库中的用户权限和角色管理
简介 在SQL Server数据库系统中,管理用户权限和角色对于确保数据安全.完整性和可访问性至关重要.在本文中,我们将探讨在SQL Server数据库中创建用户.分配权限和管理角色的过程.我们将涵盖 ...
- el-select的简单封装,使其返回值中包含key,value,obj 三种值
常规的el-select中change事件返回值,只有key返回,业务上有些需求有需要获取到value值,所以简单的封装了一下,使返回中包含key,value,obj三个值,基本上可以满足大部分的需求 ...
- Involution:空间不共享?可完全替代卷积的高性能算子 | CVPR 2021
其实这篇文章很早就写好了,但作者其它论文涉及到洗稿问题,所以先放着了.目前看这篇文章没被举报有洗稿的嫌疑,所以就发出来了 . 来源:晓飞的算法工程笔记 公众号 论文: Involution: Inve ...