290. Word Pattern

哈哈这题算是我splunk面试的题目了

1. 可以建两个map,一个正向记录map<patternLetter, word>和反向revMap<word, patterLeter>

什么长度不同的废话不说了,核心逻辑是:

  

1 如果map里面没有patternLetter
2 
3     那么如果revMap有word[i],返回false
4     不然把这一组正反加入两个map
5   否则
6 
7     如果map对应的word和当前不和 || revMap没有当前word || revMap对应pattern不是当前pattern
8       返回false
9   返回true

代码:

  

 1     public boolean wordPattern(String pattern, String str) {
 2         String[] words = str.split(" ");
 3         if (words.length != pattern.length())
 4             return false;
 5         Map index = new HashMap();
 6         for (Integer i=0; i<words.length; ++i)
 7             if (index.put(pattern.charAt(i), i) != index.put(words[i], i))
 8                 return false;
 9         return true;
10     }

-----------------------------------------------------

但是呢

大家都讨厌两个map,用一个map也可以做,只要知道有一个containsValue()函数就可以了,好像是在没啥要解释的

如果已经有的话,就比较一下存的和现在一不一样

如果没有的话,就看下现在的word有没有在value里

 

 1     public boolean wordPattern(String pattern, String str) {
 2         if(pattern == null || str == null) {
 3             return false;
 4         }
 5         String[] words = str.split(" ");
 6         if(words.length != pattern.length()) {
 7             return false;
 8         }
 9         Map<Character, String> map = new HashMap<>();
10         for(int i = 0; i < pattern.length(); i++) {
11             char c = pattern.charAt(i);
12             if(map.containsKey(c)) {
13                 if(!map.get(c).equals(words[i])) {
14                     return false;
15                 }
16             } else {
17                 if(map.containsValue(words[i])) {
18                     return false;
19                 }
20                 map.put(c, words[i]);
21             }
22         }
23         return true;
24     }

-----------------------------------------------------

Steven大神依旧有神奇的做法

 1     public boolean wordPattern(String pattern, String str) {
 2         String[] words = str.split(" ");
 3         if (words.length != pattern.length())
 4             return false;
 5         Map index = new HashMap();
 6         for (Integer i=0; i<words.length; ++i)
 7             if (index.put(pattern.charAt(i), i) != index.put(words[i], i))
 8                 return false;
 9         return true;
10     }

其实我觉得这种做法不是那么好啦,因为map都没有说明类型,虽然都是Object类型,但是感觉不是很好呢……

这里要说的意思是,发现了map函数的神奇特质

就是map.put(),如果第二次put进同样的key不同value,返回的值是被挤掉的那个value!不然就是null

所以大神的代码的意思是如果下一次发现了一对Pattern+word,他们上次出现的位置应该是一样的。就是现在放入的这一对,如果在map中已经存在,那么上次放入的也应该是同一对

 

posted @ 2016-10-15 05:59  warmland  阅读(849)  评论(0编辑  收藏  举报