leetcode
leetcode 2951 ~ 3000
验证外星语词典

验证外星语词典

难度:

标签:

题目描述

English description is not available for the problem. Please switch to Chinese.

代码结果

运行时间: 24 ms, 内存: 16.1 MB


/*
 * 思路:
 * 1. 使用一个哈希映射来记录每个字母在新顺序中的索引位置。
 * 2. 比较相邻的两个单词,如果前面的单词在新顺序中比后面的单词大,返回false。
 * 3. 如果所有相邻的单词都符合顺序,返回true。
 */
import java.util.stream.IntStream;
public class AlienDictionaryStream {
    public boolean isAlienSorted(String[] words, String order) {
        int[] index = new int[26];
        IntStream.range(0, order.length()).forEach(i -> index[order.charAt(i) - 'a'] = i);
        return IntStream.range(0, words.length - 1)
                .allMatch(i -> compare(words[i], words[i + 1], index) <= 0);
    }
    private int compare(String word1, String word2, int[] index) {
        int len1 = word1.length();
        int len2 = word2.length();
        int len = Math.min(len1, len2);
        for (int i = 0; i < len; i++) {
            int pos1 = index[word1.charAt(i) - 'a'];
            int pos2 = index[word2.charAt(i) - 'a'];
            if (pos1 != pos2) {
                return pos1 - pos2;
            }
        }
        return len1 - len2;
    }
}

解释

方法:

此题解首先将外星语字母表的顺序转换成一个字典,其中每个字母对应一个索引,表示其在字母表中的位置。然后定义一个辅助函数`less`来比较两个单词在外星语中的字典序。对于每一对相邻的单词,使用`less`函数进行比较,确保前一个单词在字典序上小于或等于后一个单词。如果发现任何一对单词不符合这一条件,则立即返回`false`。如果所有相邻单词都符合条件,则返回`true`。

时间复杂度:

O(N*L)

空间复杂度:

O(1)

代码细节讲解

🦆
如何处理两个单词长度不同但较短单词是较长单词的前缀的情况?例如,单词'abc'和'abcd'应该如何比较?
在这种情况下,如果较短的单词(例如'abc')是较长单词(例如'abcd')的前缀,并且在较短单词结束时没有发现任何字典序冲突,则较短的单词被认为是小于较长的单词。这是因为在外星语字典排序中,当一个单词是另一个单词的前缀时,没有更多的字符可以比较,所以较短的单词自然小于较长的单词。在题解的`less`函数中,如果遍历完较短单词的所有字符后,两个单词都没有违反字典序,则会返回`True`,表示第一个单词小于或等于第二个单词。
🦆
在为每个字母建立索引映射时(即order字典),如果输入的order字符串中包含重复的字符或不足26个字符怎么办?
如果输入的order字符串包含重复的字符,这将导致在建立字母与索引映射时出现问题,因为字典结构要求每个键(字母)对应唯一的值(索引)。这种情况在题解中并未直接处理,可能需要在实现前增加检查以确保输入的order是有效的,并且每个字符只出现一次。如果order不足26个字符,这可能意味着并非所有字母都有映射,这将影响字母表的完整性和字典序比较的正确性。理想情况下,order应包含目标语言中的所有字符,且每个字符只出现一次。
🦆
less函数在遇到第一个单词结束但第二个单词尚未结束时,直接返回True是否合适?这是否意味着所有情况下较短单词都小于较长单词?
在`less`函数中,如果第一个单词结束但第二个单词尚未结束的情况下直接返回`True`,是基于假设较短的单词在没有其他违反字典序的字符的情况下自然小于较长的单词。这是因为较短的单词是较长单词的前缀,按照字典序规则,较短的单词确实应视为小于较长的单词。这种处理方式是合理的并符合外星语字典序的比较逻辑。

相关问题