290. 单词规律
题目:
思路:
【1】这道题本质上和 205. 同构字符串 这题十分相似
区别在于一个是字符与字符互相映射,另一个是字符与字符串互相映射
而且思路都是可以借鉴的
代码展示:
//时间1 ms 击败 56.94% //内存39.3 MB 击败 82.10% //时间复杂度:O(n+m),其中 n 为 pattern 的长度,m 为 str 的长度。 //插入和查询哈希表的均摊时间复杂度均为 O(n+m)。每一个字符至多只被遍历一次。 //空间复杂度:O(n+m),其中 n 为 pattern 的长度,m 为 str 的长度。 //最坏情况下,我们需要存储 pattern 中的每一个字符和 str 中的每一个字符串。 class Solution { public boolean wordPattern(String pattern, String s) { char[] sc = pattern.toCharArray(); String[] tc = s.split(" "); if (sc.length != tc.length) return false; Map<Character, String> s2t = new HashMap<>(); Map<String, Character> t2s = new HashMap<>(); int len = sc.length; for (int i = 0; i < len; ++i) { char x = sc[i]; String y = tc[i]; if ((s2t.containsKey(x) && !s2t.get(x).equals(y)) || (t2s.containsKey(y) && t2s.get(y) != x)) { return false; } s2t.put(x, y); t2s.put(y, x); } return true; } } //时间0 ms 击败 100% //内存39.3 MB 击败 83.83% class Solution { public boolean wordPattern(String pattern, String s) { char[] sc = pattern.toCharArray(); String[] tc = s.split(" "); if (sc.length != tc.length) return false; // 由于出现的字符都由 ASCII 字符组成,所以固定最多出现256个字符 int[] si = new int[256]; Map<String, Integer> ti = new HashMap<>(); for(int i = 0; i < sc.length; i++) { // 如果两个字符的下标不对应则说明出现了不同的映射 // 如果是0则说明还没生成映射关系 if (si[sc[i]] != ti.getOrDefault(tc[i],0)) { return false; } //这里进行+1是用于表示位置,因为int数组默认初始化是0,所以不能用0进行比对 si[sc[i]] = i + 1; ti.put(tc[i], i + 1); } return true; } }