leetcode290. 单词规律
给定一种规律 pattern 和一个字符串 str ,判断 str 是否遵循相同的规律。
这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 str 中的每个非空单词之间存在着双向连接的对应规律。
示例1:
输入: pattern = “abba”, str = “dog cat cat dog”
输出: true
代码一:单映射
class Solution {
public boolean wordPattern(String pattern, String s) {
Map<String, Character> map = new HashMap<>();
List<String> list = new ArrayList<>();
char[] charp = pattern.toCharArray();
//将string字符串一空格拆分开
String[] string=s.split(" ");
//如果两边的长度不相等,返回false
if(string.length!=pattern.length()) return false;
for (int i = 0; i < string.length; i++) {
if (map.containsKey(string[i])) {
//如果已经存在这个key了,但是这个key的值映射的不是对应的pattern,不符合题意,返回false
if (map.get(string[i]) != charp[i])
return false;
} else {
//如果没有这个值,就将这个值加入
map.put(string[i], charp[i]);
}
}
//不同的值不能映射同一个pattern,所以如果有一个值出现两次的话,那么他就一定不可以
int[] seen = new int[26];
for (char c : map.values()) {
if (seen[c - 'a'] == 1)
return false;
seen[c - 'a'] = 1;
}
return true;
}
}
代码二:双映射
class Solution {
public boolean wordPattern(String pattern, String s) {
Map<String, Character> map1 = new HashMap<>();
Map<Character,String> map2=new HashMap<>();
char[] charp = pattern.toCharArray();
String[] string=s.split(" ");
if(string.length!=pattern.length()) return false;
for (int i = 0; i < string.length; i++) {
if (!map1.containsKey(string[i]))
map1.put(string[i],charp[i]);
if(!map2.containsKey(charp[i]))
map2.put(charp[i],string[i]);
//从string向patter映射和从pattern向string映射双边映射的值应该是对应的,如果不对应那么就是出错了。
if(map1.get(string[i])!=charp[i]||!map2.get(charp[i]).equals(string[i]))
return false;
}
return true;
}
}