给定一个单词序列和字母顺序。字母的顺序是一些小写字母的排列。任务是检查给定单词是否按照字母顺序在字典上排序。如果是,则返回“ True”,否则返回“ False”。
例子:
Input : Words = [“hello”, “leetcode”], Order = “habcldefgijkmnopqrstuvwxyz”
Output : true
Input : Words = [“word”, “world”, “row”], Order = “abcworldefghijkmnpqstuvxyz”
Output : false
Explanation : As ‘d’ comes after ‘l’ in Order, thus words[0] > words[1], hence the sequence is unsorted.
方法:当且仅当对相邻单词进行排序时,才按字典顺序对单词进行排序。这是因为顺序是可传递的,即如果a <= b并且b <= c,则意味着a <= c。
因此,我们的目标是检查所有相邻单词a和b是否都具有<= b。
要检查两个相邻词a和b是否满足a <= b,我们可以找到它们的第一个差异。例如,“ seen”和“ scene”具有e和c的第一个差异。之后,我们将这些字符按顺序与索引进行比较。
我们必须有效地处理空白字符。例如,如果我们将“ add”与“ addition”进行比较,则这是(NULL)与“ i”的第一个区别。
下面是上述方法的实现:
Python3
# Function to check whether Words are sorted in given Order
def isAlienSorted(Words, Order):
Order_index = {c: i for i, c in enumerate(Order)}
for i in range(len(Words) - 1):
word1 = Words[i]
word2 = Words[i + 1]
# Find the first difference word1[k] != word2[k].
for k in range(min(len(word1), len(word2))):
# If they compare false then it's not sorted.
if word1[k] != word2[k]:
if Order_index[word1[k]] > Order_index[word2[k]]:
return False
break
else:
# If we didn't find a first difference, the
# Words are like ("add", "addition").
if len(word1) > len(word2):
return False
return True
# Program Code
Words = ["hello", "leetcode"]
Order = "habcldefgijkmnopqrstuvwxyz"
# Function call to print required answer
print(isAlienSorted(Words, Order))
True
时间复杂度: O(N),其中N是所有单词中字符的总数。
辅助空间: O(1)