剑指 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;
    }
}

 

posted @ 2023-05-04 11:18  忧愁的chafry  阅读(10)  评论(0编辑  收藏  举报