题目:

给定一种规律 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)-单词规律(简单)的更多相关文章

  1. 力扣485. 最大连续1的个数-C语言实现-简单题

    题目 [题目传送门] 给定一个二进制数组, 计算其中最大连续1的个数. 示例 1: 输入: [1,1,0,1,1,1] 输出: 3 解释: 开头的两位和最后的三位都是连续1,所以最大连续1的个数是 3 ...

  2. Java实现 LeetCode 290 单词规律

    290. 单词规律 给定一种规律 pattern 和一个字符串 str ,判断 str 是否遵循相同的规律. 这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 str 中的每个非 ...

  3. LeetCode 290. 单词规律(Word Pattern) 41

    290. 单词规律 290. Word Pattern 题目描述 给定一种规律 pattern 和一个字符串 str,判断 str 是否遵循相同的规律. 这里的 遵循 指完全匹配,例如,pattern ...

  4. 力扣832. 翻转图像-C语言实现-简单题

    题目 传送门 文本 给定一个二进制矩阵 A,我们想先水平翻转图像,然后反转图像并返回结果. 水平翻转图片就是将图片的每一行都进行翻转,即逆序.例如,水平翻转 [1, 1, 0] 的结果是 [0, 1, ...

  5. 力扣566. 重塑矩阵-C语言实现-简单题

    题目 传送门 在MATLAB中,有一个非常有用的函数 reshape,它可以将一个矩阵重塑为另一个大小不同的新矩阵,但保留其原始数据. 给出一个由二维数组表示的矩阵,以及两个正整数r和c,分别表示想要 ...

  6. 力扣算法经典第一题——两数之和(Java两种方式实现)

    一.题目 难度:简单 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数, 并返回它们的数组下标. 你可以假设每种输入只会对应一 ...

  7. 力扣561. 数组拆分 I-C语言实现-简单题

    题目 传送门 给定长度为 2n 的整数数组 nums ,你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), ..., (an, bn) ,使得从 1 到 n 的 min(a ...

  8. 力扣896. 单调数列-C语言实现-简单题

    题目 传送门 文本 如果数组是单调递增或单调递减的,那么它是单调的. 如果对于所有 i <= j,A[i] <= A[j],那么数组 A 是单调递增的. 如果对于所有 i <= j, ...

  9. 力扣算法题—069x的平方根

    实现 int sqrt(int x) 函数. 计算并返回 x 的平方根,其中 x 是非负整数. 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去. 示例 1: 输入: 4 输出: 2 示例 ...

  10. LeetCode874 模拟行走机器人(简单模拟—Java之HashSet简单应用)

    题目: 机器人在一个无限大小的网格上行走,从点 (0, 0) 处开始出发,面向北方.该机器人可以接收以下三种类型的命令: -2:向左转 90 度-1:向右转 90 度1 <= x <= 9 ...

随机推荐

  1. MFC动态创建控件并添加消息映射

    目录 指定ID 对象指针 建立对象 控件样式 消息映射 按钮单击 组合框选中 指定ID 在类中声明并定义按钮控件的起始ID,以控件的类型和功能对动态控件ID进行分组,每组最好定义一个自己的起始ID方便 ...

  2. C++多态底层原理:虚函数表

    虚函数表 C++ 对象模型 在有虚函数的情况下,C++对象的模型可以概括为:虚函数表指针+数据struct.在对象所在的内存里:前8个字节(64位系统)是虚函数表所在地址,后边是对象中的member ...

  3. 在 SwiftUI 中使用 Metal Shader

    简介 从 iOS 17/macOS 14 开始,SwiftUI 支持使用 Metal shader 来实现一些特效.主要提供三个 View Modifier:colorEffect. distorti ...

  4. 基于VB6的磁性移动窗体 - 开源研究系列文章

    这次继续整理代码.这个磁性窗体是以前大学的时候开发的,当时模仿的Winamp的效果进行的编程.当时的时候有Windows API函数能够进行处理,但是XP的年代,那个API只是移动的虚框,而不是移动窗 ...

  5. 《Spring6核心源码解析》已完结,涵盖IOC容器、AOP切面、AOT预编译、SpringMVC,面试杠杠的!

    作者:冰河 博客:https://binghe.gitcode.host 文章汇总:https://binghe.gitcode.host/md/all/all.html 源码地址:https://g ...

  6. 一秒变身艺术家!U2Net 跨界肖像画,让你的头像瞬间细节完美复刻,打造个性化头像新风潮!

    效果 测试图片来自网络,如有侵权,联系删除. 项目 关注微信公众号,回复关键字:"一秒变身艺术家",获取程序! 模型信息 Inputs ---------------------- ...

  7. Oracle 章节编号排序

    测试代码 CREATE TABLE TEST (CH_CODE VARCHAR2(10)); INSERT INTO TEST (CH_CODE) VALUES ('1.1'); INSERT INT ...

  8. QT数据库学习笔记

    简介 QT通过模块化管理,对于某种模块需要添加对应的模块实现.QT SQL也是需要增加对应的模块来实现.QT数据库的层次关系为: 驱动层:数据库到SQL语言之间的桥梁 SQL API层: SQL语句的 ...

  9. 嵌入式C语言设计学习之C语言回顾

    C的基本语法-回忆 1.C的结构 C语言的结构还是以函数为主体,通过其他资源的添加来实现高级语言逻辑.所有的操作都是基于主函数展开的.以主函数为顺序列表,其他函数作为功能模块,组成一个完整的系统.所以 ...

  10. STAR法则是什么(如何把一件事表达清楚)

    STAR法则,即为Situation Task Action Result的缩写,具体含义是: Situation: 事情是在什么情况下发生 Task: 你是如何明确你的任务的 Action: 针对这 ...