这里写自定义目录标题
- 2023-8-30 09:34:23
290. 单词规律
2023-8-30 09:34:23
这道题目,我是根据 205. 同构字符串
的思路一样,都转化为另外一个第三方的字符串,在比较翻译过后的语句是不是一样的。
class Solution {
public boolean wordPattern(String pattern, String s) {
String[] s1 = s.split(" ");
return helper1(pattern).equals(helper2(s1));
}
private String helper1(String str){
int[] temp = new int[26];
StringBuilder result = new StringBuilder();
for(int i = 0; i < str.length(); i++){
int c = str.charAt(i) - 'a';
if(temp[c] == 0){
temp[c] = i + 1;
}
result.append(temp[c]);
}
return result.toString();
}
private String helper2( String[] s1){
Map<String, Integer> map = new HashMap<String, Integer>();
StringBuilder result = new StringBuilder();
for(int i = 0 ; i < s1.length; i++){
if(!map.containsKey(s1[i])){
map.put(s1[i], i +1);
}
result.append(map.get(s1[i]));
}
return result.toString();
}
}
看看官方的解法:
class Solution {
// public boolean isIsomorphic(String s, String t) {
// return isIsomorphicHelper(s).equals(isIsomorphicHelper(t));
// }
public boolean wordPattern(String pattern, String str) {
String[] words = str.split(" ");
//字符和单词是互相映射,数量必须相等
if (words.length != pattern.length()) {
return false;
}
Map<Object, Integer> map = new HashMap<>();
for (Integer i = 0; i < words.length; i++) {
/*
如果key不存在,插入成功,返回null;如果key存在,返回之前对应的value。
以pattern = "abba", str = "dog cat cat dog"为例,
第1次:map.put('a',0)返回null,map.put("dog",0)返回null,两者相等;
第2次:map.put('b',1)返回null,map.put("cat",1)返回null,两者相等;
第3次:map.put('b',2)返回1,map.put("cat",2)返回1,两者相等;
第4次:map.put('a',3)返回0,map.put("dog",3)返回0,两者相等,
结果为 true。
以pattern = "abba", str = "dog cat cat fish"为例,
第1次:map.put('a',0)返回null,map.put("dog",0)返回null,两者相等;
第2次:map.put('b',1)返回null,map.put("cat",1)返回null,两者相等;
第3次:map.put('b',2)返回1,map.put("cat",2)返回1,两者相等;
第4次:map.put('a',3)返回0,map.put("fish",3)返回null,两者不相等,
结果为 false。
*/
/*
* 为什么 Integer 在这里用的是 != 进行判断 ?
* 1. 会返回null值,如果用equals进行判断,会产生空指针异常
* 2. 理想状态的就是 Integer 的值在 0 - 25 之间进行判断,这一部分也是程序上需要返回true的情况
*/
if (map.put(pattern.charAt(i), i) != map.put(words[i], i)) {
return false;
}
}
return true;
}
}