采用和上一篇一样的思路,添加了一些边界判断,AC了但是很捞┭┮﹏┭┮。
public static boolean wordPattern(String pattern, String s) {
Map hashMap1=new HashMap<Character,String>();
Map hashMap2=new HashMap<String,Character>();
s=s+" ";
int n=s.length(),j=0;
int n1=pattern.length();
String a="";
for (int i = 0; i < n; i++) {
if(s.charAt(i)!=' '){
a=a+s.charAt(i);
continue;
}
if(j==n1){return false;}
Character p=pattern.charAt(j);
if(hashMap1.containsKey(p)&&!hashMap1.get(p).equals(a)||hashMap2.containsKey(a)&&hashMap2.get(a)!=p){
return false;
}
j++;
hashMap1.put(p,a);
hashMap2.put(a,p);
a="";
}
if(j<n1){return false;}
return true;
}
看题解过程中发现一个大佬的题解:
利用map的put方法特性————调用put方法时,如果已经存在一个相同的key, 则返回的是前一个key对应的value,同时该key的新value覆盖旧value,如果是新的一个key,则返回的是null。
利用这个特性就可以只建立一个哈希表来实现是否关联。大大减少了空间和时间的利用。
public boolean wordPattern(String pattern, String s) {
Map map=new HashMap<Object,Integer>();
//将s字符串按照空格分开成单独的一个个单词
String [] words=s.split(" ");
if(words.length!=pattern.length())return false;
//使用Integer不用int是因为Integer可以自动装箱,Integer的范围为【-128-127】,超出范围Integer会自动创建新的对象,但是map.put返回的value的对象是同一个Integer对象,不影响==判断。使用int超出范围就会报错。
for(Integer i=0;i<words.length;i++){
if(map.put(words[i],i)!=map.put(pattern.charAt(i),i))return false;
}
return true;
}