力扣290-单词规律
一、原题题目
1.1 题目
给定一种规律 pattern 和一个字符串 str ,判断 str 是否遵循相同的规律。这里的遵循指完全匹配,例如, pattern 里的每个字母和字符串 str 中的每个非空单词之间存在着双向连接的对应规律。
1.2 示例
示例1:
输入: pattern = “abba”, str = “dog cat cat dog”
输出: true示例2:
输入: pattern = “abba”, str = “dog cat cat fish”
输出: false示例3:
输入: pattern = “aaaa”, str = “dog cat cat dog”
输出: false
示例4:
输入: pattern = “abba”, str = “dog dog dog dog”
输出: false
说明: 你可以假设 pattern 只包含小写字母,str 包含了由单个空格分隔的小写字母。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/word-pattern
二、解题思路
2.1 题目意思理解
这个题目是个很简单的题目,很容易想到思路。
- 首先用 split 函数将字符串 str 按空格切割成字符串数组 arraystr []。
- 比较 pattern 与 arraystr 的长度,如果不相同直接返回 false ,否则进入下面的比较过程。
- 建立一个 HashMap,键用来存储 pattern 中的字母,值用来存储 arraystr 数组中对应位置的单词,当然在存储的过程中会进行检验的,当键值对都没存在过时则加入 HashMap ,当有一个(键或值)存在时,取出该键值对与当前准备插入的比较,若完全相同则符合,直接下一个,若有一个(键或值)不相同时,则直接返回 false 。
- 如果程序跑到了最后还没返回 false 则返回 true 。
2.2 详细代码(Java)
public class Solution {
public boolean wordPattern(String pattern, String s) {
String[] arraystr = s.split(" "); // 分割字符串
if (arraystr.length != pattern.length()) return false; // 长度不同,直接返回false
HashMap<Character,String> map = new HashMap<>();
for (int i = 0;i<pattern.length();i++){
if (!map.containsKey(pattern.charAt(i))){ // 当前键在map中没存在过
if (!map.containsValue(arraystr[i])) // 当前值在map中也没存在过
map.put(pattern.charAt(i),arraystr[i]); // 都没存在则加入map
else return false; // 健不存在但值存在,返回false
}
else { // 键存在
if (map.get(pattern.charAt(i)).equals(arraystr[i]));// 值也存在,并且就是对应的键值对,什么也不做跳过
else return false; // 所存的键值对与当前不一样,返回false
}
}
return true; // 遍历结束,没有中途返回false的说明符合规律
}
}
- 代码第13行进行字符串内容的比较的时候一定要用.equals函数来比较,不能用==或!=,否则都会出错。
2.3 算法执行结果

三、总结分析
题目很简单,单纯的哈希表的练习。