【题目】290. 单词规律
给定一种规律 pattern 和一个字符串 str ,判断 str 是否遵循相同的规律。
这里的 遵循 指完全匹配,例如, 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
示例 4:
输入: pattern = "abba", str = "dog dog dog dog"
输出: false
说明:你可以假设 pattern 只包含小写字母, str 包含了由单个空格分隔的小写字母。
【解题思路1】哈希表
class Solution {
public boolean wordPattern(String pattern, String str) {
String[] arr=str.split(" ");
if(pattern.length()!=arr.length) return false;
// 将a-dog作为key-value映射到hash表中
Map<Character,String> hashmap=new HashMap<>();
int num=0;
for(int i=0;i<arr.length;i++){
// 如果键不存在,那就加入到hash表中
if(!(hashmap.containsKey(pattern.charAt(i)))){
// 但值得注意的情况是 键不存在,但值存在,这就错了,
if(hashmap.containsValue(arr[i])) return false;
hashmap.put(pattern.charAt(i),arr[i]);
}else{
// 键存在的情况下,如果该键对应的值不能与当前值匹配的话,那也错了
if(!hashmap.get(pattern.charAt(i)).equals(arr[i])) return false;
}
}
return true;
}
}
【解题思路2】indexOf函数
class Solution {
public boolean wordPattern(String pattern, String str) {
String[] words = str.split(" "); //根据空格提取字符串
int len = pattern.length();
if(len != words.length) return false;
for(int i = 0; i < len; i++){
char a = pattern.charAt(i);
String b = words[i];
if(pattern.indexOf(a) != indexOfWords(words,b))
return false;
}
return true;
}
private int indexOfWords(String[] a, String b) {
for(int i = 0; i < a.length; i++)
if(a[i].equals(b)) return i;
return -1;
}
}
//另一种写法
class Solution {
public boolean wordPattern(String pattern, String str) {
String[] arr = str.split(" ");
if (pattern.length() != arr.length) return false;
int len = pattern.length();
for (int i = 0; i < len; i++) {
if(pattern.indexOf(pattern.charAt(i)) != indexOf(arr, arr[i])){
return false;
}
}
return true;
};
public static int indexOf(String[] arrays, String searchString) {
int ans = -1;
for(int i = 0; i < arrays.length; i++) {
if (arrays[i].equals(searchString)) {
ans = i;
break;
};
};
return ans;
}
}