Algorithms first
单词规律 · 交互式算法学习
判断模式字符与单词是否一一对应。
#290 · 哈希表
单词规律
Word Pattern
pattern = "abba", s = "dog cat cat dog"线性序列3 个关键状态
步骤 1登记 a↔dog。
a:doga:dog
0b:cat
1b:cat
2a:dog
3推荐
双向映射
时间
O(n)空间 O(n)字符到单词和单词到字符同时登记。
1function wordPattern(p, s) {2 const w = s.split(' '),3 a = new Map(),4 b = new Map();5 if (w.length !== p.length) return false;6 for (let i = 0; i < p.length; i++) {7 if ((a.has(p[i]) && a.get(p[i]) !== w[i]) || (b.has(w[i]) && b.get(w[i]) !== p[i])) return false;8 a.set(p[i], w[i]);9 b.set(w[i], p[i]);10 }11 return true;12}多语言参考
来源 · CC BY-SA 4.0 ↗Java · C++ · Go
这是一组同题正确实现,独立于上方当前动画方法;不同语言可能采用另一种正确策略。
1class Solution {2 public boolean wordPattern(String pattern, String s) {3 String[] ws = s.split(" ");4 if (pattern.length() != ws.length) {5 return false;6 }7 Map<Character, String> d1 = new HashMap<>();8 Map<String, Character> d2 = new HashMap<>();9 for (int i = 0; i < ws.length; ++i) {10 char a = pattern.charAt(i);11 String b = ws[i];12 if (!d1.getOrDefault(a, b).equals(b) || d2.getOrDefault(b, a) != a) {13 return false;14 }15 d1.put(a, b);16 d2.put(b, a);17 }18 return true;19 }20}交互式算法学习
从执行步骤真正理解 LeetCode 经典 150
本站整理 150 道高频算法面试题和 302 种解法。动画方法同步展示 JavaScript 与 Python;每题另提供 Java、C++ 与 Go 同题参考实现。
AlgoViz Lab
单词规律 · 解法对比
判断模式字符与单词是否一一对应。
- 测试用例
pattern = "abba", s = "dog cat cat dog"- 题目分类
- 哈希表
- 解法对比
- 2
规范化模式
把字符序列和单词序列都转换为首次出现下标。
- 时间
O(n²)- 空间
O(n)
双向映射
字符到单词和单词到字符同时登记。
- 时间
O(n)- 空间
O(n)