Сложность: hard
Есть новый инопланетный язык, который использует английский алфавит. Однако порядок букв в нем неизвестен.
Вам дан список строк words из словаря инопланетного языка. Утверждается, что строки в words отсортированы лексикографически по правилам этого нового языка.
Если это утверждение неверно и данное расположение строк в words не может соответствовать никакому порядку букв, верните "".
В противном случае верните строку из уникальных букв нового инопланетного языка, отсортированных в лексикографическом порядке по правилам нового языка. Если существует несколько решений, верните любое из них.
Пример:
Input: words = ["wrt","wrf","er","ett","rftt"]
Output: "wertf"
👨💻 Алгоритм:
1⃣Извлечение отношений порядка и создание списков смежности:
Извлечь отношения порядка между буквами из слов.
Вставить их в список смежности, обрабатывая случаи, когда одно слово является префиксом другого.
2⃣Подсчет числа входящих ребер:
Подсчитать количество входящих ребер (in-degree) для каждой буквы.
Построить исходящий список смежности и одновременно считать входящие ребра для каждой буквы.
3⃣Обход в ширину (BFS):
Инициализировать очередь буквами с нулевым in-degree.
Выполнять BFS, добавляя буквы в результат, когда их in-degree становится нулевым.
Продолжать до тех пор, пока очередь не станет пустой.
Проверить наличие циклов и вернуть результат.
😎 Решение:
import java.util.*;
class Solution {
public String alienOrder(String[] words) {
Map<Character, Set<Character>> adjList = new HashMap<>();
Map<Character, Integer> inDegree = new HashMap<>();
for (String word : words) {
for (char c : word.toCharArray()) {
inDegree.put(c, 0);
}
}
for (int i = 0; i < words.length - 1; i++) {
String firstWord = words[i];
String secondWord = words[i + 1];
for (int j = 0; j < Math.min(firstWord.length(), secondWord.length()); j++) {
char c = firstWord.charAt(j);
char d = secondWord.charAt(j);
if (c != d) {
if (!adjList.containsKey(c)) {
adjList.put(c, new HashSet<>());
}
if (adjList.get(c).add(d)) {
inDegree.put(d, inDegree.get(d) + 1);
}
break;
}
}
if (secondWord.length() < firstWord.length() && firstWord.startsWith(secondWord)) {
return "";
}
}
Queue<Character> queue = new LinkedList<>();
for (Map.Entry<Character, Integer> entry : inDegree.entrySet()) {
if (entry.getValue() == 0) {
queue.add(entry.getKey());
}
}
StringBuilder output = new StringBuilder();
while (!queue.isEmpty()) {
char c = queue.poll();
output.append(c);
if (adjList.containsKey(c)) {
for (char d : adjList.get(c)) {
inDegree.put(d, inDegree.get(d) - 1);
if (inDegree.get(d) == 0) {
queue.add(d);
}
}
}
}
if (output.length() < inDegree.size()) {
return "";
}
return output.toString();
}
}
Ставь 👍 и забирай 📚 Базу знаний