LeetCode 五月打卡-day17

Posted 王六六的IT日常

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 五月打卡-day17相关的知识,希望对你有一定的参考价值。

953. 验证外星语词典
题目描述:
某种外星语也使用英文小写字母,但可能顺序 order 不同。字母表的顺序(order)是一些小写字母的排列。
给定一组用外星语书写的单词 words,以及其字母表的顺序 order,只有当给定的单词在这种外星语中按字典序排列时,返回 true;否则,返回 false


参考题解:
【宫水三叶】简单自定义排序模拟题

为了快速判断某两个字符在字典序的前后关系,先使用一个大小与字符集(在本题当中就是26个英文字母)相等的数组对 order 进行转存。

然后对 words 进行拷贝复制得到 clone,并执行自定义排序,最后根据排序前后顺序是否相等来返回答案。

class Solution 
    public boolean isAlienSorted(String[] words, String order) 
        int[] ord = new int[26];
        for (int i = 0; i < 26; i++) 
            ord[order.charAt(i) - 'a'] = i;
        
        //对 words 进行拷贝复制
        String[] clone = words.clone();
        //自定义排序
        Arrays.sort(clone, (a, b)->
            int n = a.length(), m = b.length();
            int i = 0, j = 0;
            while (i < n && j < m) 
                int c1 = a.charAt(i) - 'a', c2 = b.charAt(j) - 'a';
                if (c1 != c2) 
                    return ord[c1] - ord[c2];
                
                i++; 
                j++;
            
            if (i < n) return 1;
            if (j < m) return -1;
            return 0;
        );
        int n = words.length;
        for (int i = 0; i < n; i++) 
            if (!clone[i].equals(words[i])) return false;
        
        return true;
    

方法二:直接遍历

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;
    

以上是关于LeetCode 五月打卡-day17的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 五月打卡-day11

LeetCode 五月打卡-day01

LeetCode 五月打卡-day19

LeetCode 五月打卡-day07

LeetCode 五月打卡-day20

LeetCode 五月打卡-day08