Skip to content

Commit dacf0f1

Browse files
committedMay 30, 2022
feat: update solutions to lc/lcof2 problems
lc No.0269 & lcof2 No.114.Alien Dictionary
1 parent 58b0333 commit dacf0f1

File tree

2 files changed

+17
-13
lines changed
  • lcof2/剑指 Offer II 114. 外星文字典
  • solution/0200-0299/0269.Alien Dictionary

2 files changed

+17
-13
lines changed
 

‎lcof2/剑指 Offer II 114. 外星文字典/README.md

+9-7
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
<pre>
3939
<strong>输入:</strong>words = [&quot;z&quot;,&quot;x&quot;,&quot;z&quot;]
4040
<strong>输出:</strong>&quot;&quot;
41-
<strong>解释:</strong>不存在合法字母顺序,因此返回 <code>&quot;&quot;</code>
41+
<strong>解释:</strong>不存在合法字母顺序,因此返回 &quot;&quot;
4242
</pre>
4343

4444
<p>&nbsp;</p>
@@ -59,21 +59,23 @@
5959

6060
<!-- 这里可写通用的实现逻辑 -->
6161

62-
用 g 数组记录在火星字典中的字母先后关系,`g[i][j] = true` 表示字母 `i + 'a'` 在字母 `j + 'a'` 的前面;用 s 数组记录当前字典出现过的字母,cnt 表示出现过的字母数。
62+
**方法一:拓扑排序 + BFS**
6363

64-
一个很简单的想法是遍历每一个单词,比较该单词和其后的所有单词,把所有的先后关系更新进 g 数组,这样遍历时间复杂度为 `O(n^3)`;但是我们发现其实比较相邻的两个单词就可以了,比如 `a < b < c` 则比较 `a < b``b < c`, a 和 c 的关系便确定了。因此算法可以优化成比较相邻两个单词,时间复杂度为 `O(n²)`
64+
用数组 $g$ 记录在火星字典中的字母先后关系,$g[i][j] = true$ 表示字母 $i + 'a'$ 在字母 $j + 'a'$ 的前面;用数组 $s$ 记录当前字典出现过的字母,$cnt$ 表示出现过的字母数。
65+
66+
一个很简单的想法是遍历每一个单词,比较该单词和其后的所有单词,把所有的先后关系更新进数组 $g$,这样遍历时间复杂度为 $O(n^3)$;但是我们发现其实比较相邻的两个单词就可以了,比如 $a < b < c$ 则比较 $a < b$ 和 $b < c$, $a$ 和 $c$ 的关系便确定了。因此算法可以优化成比较相邻两个单词,时间复杂度为 $O(n²)$。
6567

6668
出现矛盾的情况:
6769

68-
- `g[i][j] = g[j][i] = true`
70+
- $g[i][j]$ = $g[j][i]$ = $true$
6971
- 后一个单词是前一个单词的前缀;
70-
- 在拓扑排序后 ans 的长度小于统计到的字母个数。
72+
- 在拓扑排序后 $ans$ 的长度小于统计到的字母个数。
7173

7274
拓扑排序:
7375

7476
- 统计所有出现的字母入度;
75-
- 将所有入度为 0 的字母加入队列;
76-
- 当队列不空,出队并更新其他字母的入度,入度为 0 则入队,同时出队时将当前字母加入 ans 的结尾;
77+
- 将所有入度为 $0$ 的字母加入队列;
78+
- 当队列不空,出队并更新其他字母的入度,入度为 $0$ 则入队,同时出队时将当前字母加入 $ans$ 的结尾;
7779
- 得到的便是字母的拓扑序,也就是火星字典的字母顺序。
7880

7981
<!-- tabs:start -->

‎solution/0200-0299/0269.Alien Dictionary/README.md

+8-6
Original file line numberDiff line numberDiff line change
@@ -57,21 +57,23 @@
5757

5858
<!-- 这里可写通用的实现逻辑 -->
5959

60-
用 g 数组记录在火星字典中的字母先后关系,`g[i][j] = true` 表示字母 `i + 'a'` 在字母 `j + 'a'` 的前面;用 s 数组记录当前字典出现过的字母,cnt 表示出现过的字母数。
60+
**方法一:拓扑排序 + BFS**
6161

62-
一个很简单的想法是遍历每一个单词,比较该单词和其后的所有单词,把所有的先后关系更新进 g 数组,这样遍历时间复杂度为 `O(n^3)`;但是我们发现其实比较相邻的两个单词就可以了,比如 `a < b < c` 则比较 `a < b``b < c`, a 和 c 的关系便确定了。因此算法可以优化成比较相邻两个单词,时间复杂度为 `O(n²)`
62+
用数组 $g$ 记录在火星字典中的字母先后关系,$g[i][j] = true$ 表示字母 $i + 'a'$ 在字母 $j + 'a'$ 的前面;用数组 $s$ 记录当前字典出现过的字母,$cnt$ 表示出现过的字母数。
63+
64+
一个很简单的想法是遍历每一个单词,比较该单词和其后的所有单词,把所有的先后关系更新进数组 $g$,这样遍历时间复杂度为 $O(n^3)$;但是我们发现其实比较相邻的两个单词就可以了,比如 $a < b < c$ 则比较 $a < b$ 和 $b < c$, $a$ 和 $c$ 的关系便确定了。因此算法可以优化成比较相邻两个单词,时间复杂度为 $O(n²)$。
6365

6466
出现矛盾的情况:
6567

66-
- `g[i][j] = g[j][i] = true`
68+
- $g[i][j]$ = $g[j][i]$ = $true$
6769
- 后一个单词是前一个单词的前缀;
68-
- 在拓扑排序后 ans 的长度小于统计到的字母个数。
70+
- 在拓扑排序后 $ans$ 的长度小于统计到的字母个数。
6971

7072
拓扑排序:
7173

7274
- 统计所有出现的字母入度;
73-
- 将所有入度为 0 的字母加入队列;
74-
- 当队列不空,出队并更新其他字母的入度,入度为 0 则入队,同时出队时将当前字母加入 ans 的结尾;
75+
- 将所有入度为 $0$ 的字母加入队列;
76+
- 当队列不空,出队并更新其他字母的入度,入度为 $0$ 则入队,同时出队时将当前字母加入 $ans$ 的结尾;
7577
- 得到的便是字母的拓扑序,也就是火星字典的字母顺序。
7678

7779
<!-- tabs:start -->

0 commit comments

Comments
 (0)
Please sign in to comment.