アルゴリズム-単語の法則
言葉の法則
给定一种规律 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 包含了由单个空格分隔的小写字母。
このトピックの難しさは簡単ですが、それは非常に特徴的です。これは、ハッシュの概念を調べる典型的な例です。
問題を解決する方法は?中間のマッピング関係を確立することにより、2つの文字列を照合できます
この質問では、パターン内の文字を、最初の出現位置に従って、最初の出現のインデックスにマップできます。
abba->0110
同時に、strは同様のルールに従ってマッピングされます
dog cat cat fish->0110
現時点では、それらの間のマッピングの値が同じであるかどうかを比較するだけで済みますが、
2番目のマッピングを実行するときは、最初のマッピングの値がすでにあるため、2番目のマッピングを保存するために配列を開く必要はありません。マッピング後、対応するビットの値を直接比較できます。
//优化后的,击败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;
}