验证外星语词典
难度:
标签:
题目描述
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'应该如何比较?
▷🦆
在为每个字母建立索引映射时(即order字典),如果输入的order字符串中包含重复的字符或不足26个字符怎么办?
▷🦆
less函数在遇到第一个单词结束但第二个单词尚未结束时,直接返回True是否合适?这是否意味着所有情况下较短单词都小于较长单词?
▷