题目要求按照给定的字母表 order 的顺序,检测给定的字符串数组是否按照 order 的字典升序排列,我们只需要依次检测 strs 中的字符串前一个字符串和后一个字符串在给定的字母表下小的字典序即可。具体检测如下:
首先将给定的 order 转化为字典序索引 index,index}[i] 表示字符 i 在字母表 order 的排序索引,index}[i] > \textit{index}[j] 即表示字符 i 在字母表中的字典序比字符 j 的字典序大,index}[i] < \textit{index}[j] 即表示字符 i 在字母表中的字典序比字符 j 的字典序小。
依次检测第 i 个单词 strs}[i] 与第 i-1 个单词 strs}[i-1] 的字典序大小,我们可以依次判断两个单词中从左到右每个字符的字典序大小,当第一次出现两个字符的字典序不同时,即可判断两个字符串的字典序的大小。
特殊情况需要处理,设 strs}[i] 的长度为 m,strs}[i] 的长度小于 strs}[i-1] 的长度且 strs}[i-1] 的前 m 个字符与 strs}[i-1] 的前 m 个字符相等,此时 strs}[i-1] 的字典序大于 strs}[i] 的字典序。
代码
[sol1-Python3]
1 2 3 4
classSolution: defisAlienSorted(self, words: List[str], order: str) -> bool: index = {c: i for i, c inenumerate(order)} returnall(s <= t for s, t in pairwise([index[c] for c in word] for word in words))
funcisAlienSorted(words []string, order string)bool { index := [26]int{} for i, c := range order { index[c-'a'] = i } next: for i := 1; i < len(words); i++ { for j := 0; j < len(words[i-1]) && j < len(words[i]); j++ { pre, cur := index[words[i-1][j]-'a'], index[words[i][j]-'a'] if pre > cur { returnfalse } if pre < cur { continue next } } iflen(words[i-1]) > len(words[i]) { returnfalse } } returntrue }
复杂度分析
时间复杂度:O(m \times n),其中 m 为字符串数组的长度,n 为数组中字符串的平均长度,每个字符串需要前一个字符串进行比较,因此时间复杂度为 O(m \times n)。
空间复杂度:O(C)。其中 C 表示字母表的长度,需要存储字母表 order 每个字符的字典序索引,题目中给定的字母表的长度为 C = 26。