核心思路:
将字母之间先后顺序的关系映射为对应的数字之间的关系,用邻接表存放映射关系,用拓扑排序实现字母在一维度下的顺序输出。
import java.util.*;
public class Main {
public static void main(String[] args) {
LinkedList<LinkedList<Integer>> list=new LinkedList<>();
int[] d = new int[26];
boolean[] vis = new boolean[26];
Scanner scanner = new Scanner(System.in);
String str=scanner.nextLine();
String[] strNUm=str.split(" ");
for (int i = 0; i < 26; i++) {
list.add(new LinkedList<>());
}
for (int i = 0; i < strNUm.length ; i++) {
int a=strNUm[i].charAt(0)-'A';
int b=strNUm[i].charAt(3)-'A';
d[a]++;
list.get(b).add(a);
vis[a] = vis[b] = true;
}
LinkedList<Integer> s = new LinkedList<>();
List<Integer> res = new LinkedList<>();
for (int i = 0; i < 26; i++) {
if (d[i]==0&&vis[i]){
s.add(i);
}
}
while (!s.isEmpty()){
int temp=s.poll();
res.add(temp);
for (int x : list.get(temp)) {
d[x]--;
if (d[x]==0){
s.add(x);
}
}
}
for (int x:res
){
char ch=(char)(x+'A');
System.out.println(ch+" ");
}
}
}