题目:

给定一种规律 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. CYQ.Data 操作 Redis 性能测试:对比 StackExchange.Redis

    前言: 前几天,点开自己的博客,看了一下 CYQ.Data V5系列 都有哪些文章, 发现了一篇2019年写的:CYQ.Data 对于分布式缓存Redis.MemCache高可用的改进及性能测试,于是 ...

  2. 基于TLSR8359的2.4G私有协议多发一收方案解析

    一 简析 1.简介 泰凌微的2.4G私有协议芯片在市场应用十分广泛. 2.特性 无线传输距离远 功耗低,接口丰富 自带mcu功能,可实现mcu+2.4G的私有功能 二 源码解析 1.原理图 框图如下所 ...

  3. Leetcode 2157 字符串分组

    广度搜索+哈希表+状态转换 贴代码: import java.util.HashMap; import java.util.HashSet; import java.util.LinkedList; ...

  4. Linux进程管理、安全

    1.介绍 1.什么是进程 比如: 开发写的代码我们称为程序,那么将开发的代码运行起来.我们称为进程. 总结一句话就是: 当我们运行一个程序,那么我们将运行的程序叫进程. PS1: 当程序运行为进程后, ...

  5. ARouter路由解析

    目录介绍 01.原生跳转实现 02.实现组件跳转方式 2.1 传统跳转方式 2.2 为何需要路由 03.ARouter配置与优势 04.跨进程组件通信 4.1 URLScheme 4.2 AIDL 4 ...

  6. HttpClient 3.1 发送 https 请求跳过验证

    环境: 依赖: <dependency> <groupId>commons-httpclient</groupId> <artifactId>commo ...

  7. 深度解读UUID:结构、原理以及生成机制

    What 是 UUID UUID (Universally Unique IDentifier) 通用唯一识别码 ,也称为 GUID (Globally Unique IDentifier) 全球唯一 ...

  8. R语言安装教程

    R 语言官方网站:The Comprehensive R Archive Network 官方镜像站列表:CRAN - Mirrors 一.官网下载R安装包 下载地址为:Index of /bin 进 ...

  9. Java13版本特性【一文了解】

    「MoreThanJava」 宣扬的是 「学习,不止 CODE」,本系列 Java 基础教程是自己在结合各方面的知识之后,对 Java 基础的一个总回顾,旨在 「帮助新朋友快速高质量的学习」. 当然 ...

  10. C#中字典集合的两种遍历

    记录一下 Dictionary<string, string> dictionary = new Dictionary<string,string>(); foreach (s ...