https://leetcode.com/problems/verifying-an-alien-dictionary | Easy |
---|
В некотором инопланетном языке используются английские строчные буквы, но, возможно, в другом порядке. Вам дан массив слов words
, написанных на этом языке, и строка order
, представляющая порядок алфавита. Требуется определить, отсортированы ли слова в массиве words
лексикографически в соответствии с данным порядком алфавита.
Input:
words = ["hello","leetcode"], order = "hlabcdefgijkmnopqrstuvwxyz”Output:
trueExplanation:
Поскольку 'h' предшествует 'l' в данном языке, последовательность слов отсортирована.
Input:
words = ["word","world","row"], order = "worldabcefghijkmnpqstuvxyz”Output:
falseExplanation:
Поскольку 'd' следует после 'l' в данном языке, слова[0] > слова[1], следовательно, последовательность не отсортирована.
Input:
words = ["apple","app"], order = "abcdefghijklmnopqrstuvwxyz”Output:
falseExplanation:
Первые три символа "app" совпадают, но вторая строка короче. Согласно лексикографическим правилам, "apple" > "app", потому что 'l' > '∅', где '∅' обозначает пустой символ, который меньше любого другого символа.
fun isAlienSorted(words: Array<String>, order: String): Boolean {
// Создаем массив для хранения индексов символов в новом алфавитном порядке
val index = IntArray(26)
for (i in order.indices) {
index[order[i] - 'a'] = i
}
// Функция для сравнения двух слов в соответствии с новым порядком
fun isOrdered(word1: String, word2: String): Boolean {
val len1 = word1.length
val len2 = word2.length
val minLen = minOf(len1, len2)
for (i in 0 until minLen) {
val char1 = word1[i]
val char2 = word2[i]
if (char1 != char2) {
return index[char1 - 'a'] < index[char2 - 'a']
}
}
return len1 <= len2
}
// Проверяем каждую пару соседних слов
for (i in 0 until words.size - 1) {
if (!isOrdered(words[i], words[i + 1])) {
return false
}
}
return true
}
O(C), где C — общее количество символов во всех словах.
O(1), поскольку используется фиксированный дополнительный массив размером 26 для хранения индексов символов.