算法-单词规律
单词规律
给定一种规律 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 包含了由单个空格分隔的小写字母。
此题目难度easy,但是很有特色,是考察hash思想的一个典型例子。
怎么去解决问题呢?我们可以通过建立一种中间映射的关系来对两个字串进行匹配
在本题中,我们可以将pattern中的字符按照他第一次出现的位置,映射为其第一次出现位置的索引,也就是
abba->0110
与此同时,将str按照同类规则映射
dog cat cat fish->0110
这时候只需要比较一下他们中间映射的值是否相同即可
不过在我们进行第二次映射的时候,由于我们已经有了第一次映射的值,我们就不需要再开个数组存第二个映射了,我们直接比对应位的值即可。
//优化后的,击败98%
public boolean wordPattern(String pattern, String str) {
Map<Character,Integer> cmap=new HashMap<>();//记录元素出现的第一个位置
char[] cp=pattern.toCharArray();
String[] cs=str.split(" ");
if(cs.length!=cp.length){
return false;
}
int[] ccp=new int[pattern.length()];
for(int i=0;i<cp.length;i++){
if(!cmap.containsKey(cp[i])){
cmap.put(cp[i],i);
}
ccp[i]=cmap.get(cp[i]);
}
Map<String,Integer> smap=new HashMap<>();//记录元素出现的第一个位置
for(int i=0;i<cs.length;i++){
if(!smap.containsKey(cs[i])){
smap.put(cs[i],i);
}
if(ccp[i]!=smap.get(cs[i])){
return false;
}
}
return true;
}
//未优化的,击败8%
public boolean wordPattern(String pattern, String str) {
Map<Character,Integer> cmap=new HashMap<>();//记录元素出现的第一个位置
char[] cp=pattern.toCharArray();
StringBuilder sb1=new StringBuilder();
for(int i=0;i<cp.length;i++){
if(!cmap.containsKey(cp[i])){
cmap.put(cp[i],i);
}
sb1.append(cmap.get(cp[i]));
}
String[] cs=str.split(" ");
Map<String,Integer> smap=new HashMap<>();//记录元素出现的第一个位置
StringBuilder sb2=new StringBuilder();
for(int i=0;i<cs.length;i++){
if(!smap.containsKey(cs[i])){
smap.put(cs[i],i);
}
sb2.append(smap.get(cs[i]));
}
if(sb1.toString().equals(sb2.toString())){
return true;
}
return false;
}