dictionnaire de Mars. Signification des questions est de donner un bouquet de chaînes, vous sortie (pas notre compréhension normale de l'ordre de 26 lettres) de l'ordre réel des lettres entre eux. exemple,
Exemple 1:
Contribution: [ "WRT", « FRM », « Il » "Ett", "RFTT" ] Production:"wertf"
Exemple 2:
Contribution: [ "Z", "X" ] Production:"zx"
Exemple 3:
Contribution: [ "Z", "X", "Z" ] Production:""
Explication: L'ordre est invalide, le retour si""
.
L'idée est tri topologique , on m'a donné ici BFS solution de. Tout d' abord, pour chacune des lettres ont tous participé à une pénétration 1, alors que la nécessité de calculer l'implication totale ici combien différentes lettres comptent. Après avoir traversé l'entrée à nouveau, ce besoin de temps pour créer un graphique de bords. Il est un moyen de créer une table de hachage, l' étape quelques plus de détails sur les points ci - dessous.
Après comparaison mot par paires, d'abord découvert une autre lettre, comme cet exemple,
"wr t "和" wr f "
Mettez t comme clé dans la hashmap, la carte la valeur est un HashSet, alors f rejoindre HashSet, mais aussi le degré de f ++, immédiatement après la pause (entre tous les deux mots, car, en fait, ne peut obtenir un maximum de deux l'ordre relatif entre les lettres). Après tout faire les mêmes mots parcourus, créez un graphique en fonction du degré de la table, ou mis dans une lettre de 1 rejoindre la file d'attente. Après avoir créé un graphique, encore une fois, il est comme parcourir un programme de cours BFS chaque bord, le moment en file d'attente pop traversal caractères à ajouter au jeu de résultats, en même temps de voir si ce personnage hashmap, si, ils peuvent aller voir son correspondant HashSet il n'y a pas de pénétration de la lettre 1, si la file d'attente a également ajouté. Enfin, si la longueur de la res jeu de résultats compte est incompatible avec une chaîne vide est renvoyée.
Temps O (V + E)
Espace O (n) - le nombre de mots
implémentation Java
Une classe Solution { 2 publique statique chaîne alienOrder (String [] mots) { 3 si (mots == null || words.length == 0 ) 4 retour "" ; 5 res StringBuilder = nouveau StringBuilder (); 6 HashMap <caractère, caractère <>> map = nouvelle HashMap <> (); 7 int [] = degré nouveau int [26 ]; 8 int count = 0 ; 9 pour (mot chaîne: mots) { 10 pour ( omble c: word.toCharArray ()) { 11 si (degré [c - 'a'] == 0 ) { 12 comptage ++ ; 13 degré [c - 'a'] = 1 ; 14 } 15 } 16 } 17 18 pour ( int i = 0; i <words.length - 1; i ++ ) { 19 carbonisation [] cur = mots [i] .toCharArray (); 20 carbonisation [] next = mots [i + 1 ] .toCharArray (); 21 // cas d'angle 22 // [ "abc", "ab"] 23 si (cur.length> next.length && mots [i] .startsWith (mots [i + 1 ])) { 24 retour "" ; 25 } 26 27 // cas normal, créé le graphique 28 int len = Math.min (cur.length, next.length); 29 pour ( int j = 0; j <len; j ++ ) { 30 si (! Cur [j] = suivante [j]) { 31 si (! Map.containsKey (cur [j])) { 32 map.put ( cur [j], nouveau HashSet <>()); 33 } 34 si (. Map.get (cur [j]) ajouter (suivant [j])) { 35 degrés [suivante [j] - 'a'] ++ ; 36 } 37 break ; 38 } 39 } 40 } 41 42 Queue <caractères> file d' attente = nouveau LinkedList <> (); 43 pour ( int i = 0; i <26; i ++ ) { 44 si (degré [i] == 1 ) { 45 queue.offer (( omble) ( 'A' + i)); 46 } 47 } 48 49 tout (! Queue.isEmpty ()) { 50 ombles c = queue.poll (); 51 res.append (c); 52 si (map.containsKey (c)) { 53 pour ( omble ch: map.get (c)) { 54 si (--degree [ch - 'a'] == 1 ) { 55 queue.offer (ch) ; 56 } 57 } 58 } 59 } 60 si (res.length () =! count) { 61 retour "" ; 62 } 63 retour res.toString (); 64 } 65 }