剑指 Offer II 034. 外星语言是否排序(953. 验证外星语词典)
题目:
思路:
【0】这道题重点在于理解题目,要求的不是words数组内的每个字符串内部是有序的,而是两两字符串进行比较
示例1:
参数: words = ["hello","leetcode"], order = "hlabcdefgijkmnopqrstuvwxyz"
分析:
先按照order给予每个字符串一个序号,基于只有小写字母,按照abcd..xyz这样可以用int存储
下标key对应,
0=>a
1=>b
...
y=>24
z=>25
那么值value就是对应在order的位置
[2, 3, 4, 5, 6, 7, 8, 0, 9, 10, 11, 1, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25]
所以a在order下标为2(下标是从0开始的)
因为hello的h比leetcode的l小,故是符合升序的
但是如果出现"word"和"world"这种呢,就会继续遍历下去直至找到两个不相等的字符
当然又会出现"apple"和"app"这种,就是不会出现两个不相等的字符。那么这时候字符长度短的要在前面。
【1】直接遍历
代码展示:
直接遍历:
//时间0 ms击败100% //内存40.4 MB击败36.78% //时间复杂度:O(m×n),其中 m 为字符串数组的长度,n 为数组中字符串的平均长度,每个字符串需要前一个字符串进行比较,因此时间复杂度为 O(m×n)。 //空间复杂度:O(C)。其中 C 表示字母表的长度,需要存储字母表 order 每个字符的字典序索引,题目中给定的字母表的长度为 C=26。 class Solution { public boolean isAlienSorted(String[] words, String order) { int[] index = new int[26]; //给字母标记一个序号 for (int i = 0; i < order.length(); ++i) { index[order.charAt(i) - 'a'] = i; } for (int i = 1; i < words.length; i++) { boolean valid = false; for (int j = 0; j < words[i - 1].length() && j < words[i].length(); j++) { int prev = index[words[i - 1].charAt(j) - 'a']; int curr = index[words[i].charAt(j) - 'a']; // 当两个单词存在不相同的字符,则当前单词的字符序应该大于前面单词的字符序 if (prev < curr) { valid = true; break; } else if (prev > curr) { return false; } } if (!valid) { // 当两单词字符完全相同时,短的单词应该在前 if (words[i - 1].length() > words[i].length()) { return false; } } } return true; } }