leetcode
leetcode 851 ~ 900
验证外星语词典

验证外星语词典

难度:

标签:

题目描述

代码结果

运行时间: 25 ms, 内存: 0.0 MB


/*
 * 思路:
 * 1. 使用 Stream API 和 Lambda 表达式来简化代码。
 * 2. 首先将 order 转换为一个索引映射表。
 * 3. 然后使用 Stream 的 allMatch 方法来检查所有相邻的单词是否按字典序排列。
 */
import java.util.stream.IntStream;

public boolean isAlienSorted(String[] words, String order) {
    // 创建字典
    int[] orderMap = new int[26];
    for (int i = 0; i < order.length(); i++) {
        orderMap[order.charAt(i) - 'a'] = i;
    }
    
    // 使用 Stream API 进行检查
    return IntStream.range(0, words.length - 1)
                    .allMatch(i -> inCorrectOrder(words[i], words[i + 1], orderMap));
}

// 辅助函数:比较两个单词的顺序
private boolean inCorrectOrder(String word1, String word2, int[] orderMap) {
    int len1 = word1.length();
    int len2 = word2.length();
    int minLen = Math.min(len1, len2);
    for (int i = 0; i < minLen; i++) {
        int char1 = word1.charAt(i) - 'a';
        int char2 = word2.charAt(i) - 'a';
        if (orderMap[char1] < orderMap[char2]) {
            return true;
        } else if (orderMap[char1] > orderMap[char2]) {
            return false;
        }
    }
    return len1 <= len2;
}

解释

方法:

首先,这个解法通过建立一个哈希表来映射每个字符在外星语言中的索引,这样可以快速比较任意两个字符的顺序。接着,算法逐对比较相邻的单词,检查它们是否按照外星语言的字典顺序排列。对于每一对单词,从左到右比较每个字符,直到找到第一对不相同的字符或者其中一个单词先结束。如果找到不同的字符,就比较它们的顺序;如果没有找到不同的字符,就检查更短的单词是否排在前面(即确保不会出现长单词排在短单词之前的情况)。任何一次比较如果发现顺序错误,就立即返回false。如果所有的单词都检查完毕,没有发现问题,则返回true。

时间复杂度:

O(m * k)

空间复杂度:

O(1)

代码细节讲解

🦆
构建哈希表时,你是如何保证每个字符的索引正确映射到哈希表中的?
在构建哈希表时,通过遍历外星语言的字符顺序字符串 `order`,并利用循环的索引 `i`,可以确保每个字符的正确索引被记录。对于每个字符 `order[i]`,哈希表 `d` 的键是字符本身,值是该字符对应的索引 `i`。这样,每个字符都会根据其在字符串 `order` 中的位置被映射到一个唯一的整数索引上。
🦆
在比较两个单词的字符时,如果字符相同你是如何处理的?是否继续比较下一个字符,直到找到不同的字符或一个单词结束?
当比较两个单词的字符时,如果当前字符相同,算法会继续递增两个单词的索引 `p` 和 `q`,以便比较下一个字符。这个过程持续进行,直到发现第一对不同的字符或者其中一个单词的字符已全部比较完毕。这种方法确保了只有在找到明确的字典序差异或确认一个单词为另一个单词的前缀时才停止比较。
🦆
为什么在比较字符时,如果较短的单词比较完毕还没有找到不同的字符,就要检查单词的长度,而不是直接认为它们按字典序排列?
当较短的单词的所有字符都已经与较长单词的对应部分比较完毕且相同后,需要检查两个单词的长度以判断它们的字典序。这是因为如果较长的单词以较短的单词为前缀,则按字典序,较短的单词应该排在较长的单词之前。如果较短的单词排在较长的单词后面,则表示单词顺序错误,因此返回 false。
🦆
如果在比较过程中发现较短单词排在较长单词前面时,为什么会返回 false?这种情况下是如何确定两个单词的字典序的?
如果在比较过程中发现较短单词排在较长单词前面,而且较短的单词是较长单词的前缀,则这实际上是正确的字典序排列,应返回 true。但如果较长的单词以较短的单词为前缀且排在较短的单词之前,则这违反了字典序的规则,因此会返回 false。字典序的确定是基于单词的相对位置和长度来判断的。

相关问题