使用哈希表可以解决的问题
LeetCode 383. 赎金信-CSDN博客
Leetcode 49 字母异位词分组-CSDN博客
LeetCode 242 有效的字母异位词-CSDN博客
题目
已解答
简单
相关标签
相关企业
给定一种规律
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
中每个单词都被 单个空格 分隔
思路
该题思路与LeetCode205 同构字符串一样,都是判断对应关系是否唯一的
所以也是同样用两个map,一个记录a:dog这样的映射规律,一个map记录dog:a这样的映射记录
当map中key存在时,如果值与当前遍历的值不相同,就返回false
为什么要用两个map
为了防止a:dog,b:dog这样的场景出现
代码
class Solution {
public boolean wordPattern(String pattern, String s) {
HashMap<Character, String> map = new HashMap<>();
HashMap<String, Character> map1 = new HashMap<>();
int length = pattern.length();
String[] s1 = s.split(" ");
int length1 = s1.length;
//长度不相等,直接返回false
if (length1 != length) {
return false;
}
for (int i = 0; i < length1; i++) {
char c = pattern.charAt(i);
String ss = s1[i];
//判断a:dog规律是否满足
if (map.containsKey(c)) {
String s2 = map.get(c);
if (!ss.equals(s2)) {
return false;
}
//判断dog:a规律是否满a
}else if(map1.containsKey(ss)){
Character cc = map1.get(ss);
if (!cc.equals(c)) {
return false;
}
//不存在就放入map
} else {
map.put(c,ss);
map1.put(ss,c);
}
}
return true;
}
}