持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第15天,点击查看活动详情
一、题目描述:
给定一种规律 pattern
和一个字符串 s
,判断 s
是否遵循相同的规律。
这里的 遵循 指完全匹配,例如, pattern
里的每个字母和字符串 str
中的每个非空单词之间存在着双向连接的对应规律。
示例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
提示:
- 1 <= pattern.length <= 300
- pattern 只包含小写英文字母
- 1 <= s.length <= 3000
- s 只包含小写英文字母和 ' '
- s 不包含 任何前导或尾随对空格
- s 中每个单词都被 单个空格 分隔
二、思路分析:
这一题最容易想到也是最容易实现的就是通过集合的方式,以一个主键对应一个值类似映射,针对主键如果不存在,则添加进入集合,如果存在,则相同主键对应的值必然相同,否则返回false,值得一提的是,本题在主键不相同的情况下需要判断不同主键对应的值比不可能相同,这一点不能漏掉,本来打算自己额外写一个判断函数,调用两次该函数可避免使用上述的判断不同主键对应的值必不可能相同,这个是一个思考:把集合全部设置为String,调用两次该函数,有兴趣的同学可以试一试。
三、AC 代码:
class Solution {
public boolean wordPattern(String pattern, String str) {
if(pattern==null || str==null) {
return false;
}
String[] arr = str.split(" ");
if(pattern.length()!=arr.length) {
return false;
}
Map<Character,String> map = new HashMap<Character,String>();
for(int i = 0;i<pattern.length();i++) {
char tmp = pattern.charAt(i);
if(map.containsKey(tmp)) {
if(!map.get(tmp).equals(arr[i])) {
return false;
}
}else {
if(map.containsValue(arr[i])) {
return false;
}
map.put(tmp,arr[i]);
}
}
return true;
}
}
四、参考:
用相同的规则对pattern和字符串s编码,检查结果。 - 单词规律 - 力扣(LeetCode)
hashmap 构建key value, hashset 排除不同的key对应相同的value - 单词规律 - 力扣(LeetCode)