1.题目

给定一种规律 pattern 和一个字符串 str ,判断 str 是否遵循相同的规律。

这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 str 中的每个非空单词之间存在着双向连接的对应规律。

示例:

  1. 输入: pattern = "abba", str = "dog cat cat dog"
  2. 输出: true
  3. 输入:pattern = "abba", str = "dog cat cat fish"
  4. 输出: false
  5. 输入: pattern = "aaaa", str = "dog cat cat dog"
  6. 输出: false
  7. 输入: pattern = "abba", str = "dog dog dog dog"
  8. 输出: false

说明:

你可以假设 pattern 只包含小写字母, str 包含了由单个空格分隔的小写字母。

2.思路

1.png

  1. public boolean wordPattern(String pattern, String str) {
  2. String[] words = str.split(" ");
  3. //字符和单词是互相映射,数量必须相等
  4. if (words.length != pattern.length()) {
  5. return false;
  6. }
  7. Map<Object, Integer> map = new HashMap<>();
  8. for (Integer i = 0; i < words.length; i++) {
  9. /*
  10. 如果key不存在,插入成功,返回null;如果key存在,返回之前对应的value。
  11. 以pattern = "abba", str = "dog cat cat dog"为例,
  12. 第1次:map.put('a',0)返回null,map.put("dog",0)返回null,两者相等;
  13. 第2次:map.put('b',1)返回null,map.put("cat",1)返回null,两者相等;
  14. 第3次:map.put('b',2)返回1,map.put("cat",2)返回1,两者相等;
  15. 第4次:map.put('a',3)返回0,map.put("dog",3)返回0,两者相等,
  16. 结果为 true。
  17. 以pattern = "abba", str = "dog cat cat fish"为例,
  18. 第1次:map.put('a',0)返回null,map.put("dog",0)返回null,两者相等;
  19. 第2次:map.put('b',1)返回null,map.put("cat",1)返回null,两者相等;
  20. 第3次:map.put('b',2)返回1,map.put("cat",2)返回1,两者相等;
  21. 第4次:map.put('a',3)返回0,map.put("fish",3)返回null,两者不相等,
  22. 结果为 false。
  23. */
  24. if (map.put(pattern.charAt(i), i) != map.put(words[i], i)) {
  25. return false;
  26. }
  27. }
  28. return true;
  29. }