1. Build rank array: for each position i in order, rank[order[i]] = i. 2. For each adjacent pair (words[i], words[i+1]): a. Compare character by character using rank. b. At first difference: if rank[a[j]] > rank[b[j]], return false. c. If all compared characters are equal and len(a) > len(b), return false. 3. Return true if all pairs are valid.
題目描述:
在一個外星語言中,字母的排列順序與英文不同。給定一個「外星字典序」order(26 個小寫字母的排列)和一個字串陣列 words,判斷 words 是否按照此外星字典序排列。
解題思路:
order 轉為一個長度 26 的陣列,rank[c] = 字母 c 在外星字典中的位置。words[i] 和 words[i+1]:
rank[words[i][j]] > rank[words[i+1][j]],則不合法。rank[words[i][j]] < rank[words[i+1][j]],則合法,進入下一對。words[i] 較長,則不合法(例如 "apple" 應排在 "app" 之後)。時間複雜度:O(n * m) — 其中 n 是單詞數量,m 是單詞的最大長度。每對相鄰單詞最多比較 m 個字元。
空間複雜度:O(1) — rank 陣列大小固定為 26。
自定義比較器 + 排序驗證:O(n * m * log n) 時間。用外星字典序定義比較函數,排序後與原陣列比較。正確但效率較低。
字串映射轉換:O(n * m) 時間。將每個單詞的字母替換為標準順序的字母,然後直接用標準字串比較。額外空間 O(n * m)。