拓扑排序——外星文字典114
外星人字典
题目:外星文字典
给定一个字符串列表 words
,作为这门语言的词典,words
中的字符串已经 按这门新语言的字母顺序进行了排序 。
示例 1:
输入:words = ["wrt","wrf","er","ett","rftt"]
输出:"wertf"
示例2:
输入:words=["ac","ab","zc","zb"]
输出:acbz
思路:
1. 根据词典,排序: 如["wrf", "wrf"]中,r的词典排序小于f。
2. 如果字符在词典中没有顺序,则按照正常字母排序:如["ac","ed"], c和d没有顺序,则按正常顺序排序,即c<d
3.如果字符串1和字符串2的最小公共字符串都相同,若前字符串的长度大于后字符串的长度,则不符合要求:如["abc","ab"]显然不符合排序规则,返回'''';
题解
求按词典规则的拓扑排序
class Solution {
public String alienOrder(String[] words) {
Queue<Character> queue = new PriorityQueue<>();
Map<Character, List<Character>> map = new HashMap<>();
int book[]=new int[26];
Arrays.fill(book, -1);
//所有节点入度设为0
for (int i = 0; i < words.length; i++) {
String str = words[i];
for (int j = 0; j < str.length(); j++) {
book[str.charAt(j)-'a']=0;
}
}
//根据词典生成拓扑图
for (int i = 0; i < words.length - 1; i++) {
int index = 0;
while (index < words[i].length() && index < words[i + 1].length()) {
if (words[i].charAt(index) != words[i + 1].charAt(index)) {
map.putIfAbsent(words[i].charAt(index), new ArrayList<>());
if(!map.get(words[i].charAt(index)).contains(words[i+1].charAt(index)))
{
map.get(words[i].charAt(index)).add(words[i + 1].charAt(index));
book[words[i+1].charAt(index)-'a']++;
}
break;
}
index++;
}
if (index == Math.min(words[i].length(), words[i + 1].length())) {
if (words[i].length() > words[i + 1].length()) {
return "";
}
}
}
//节点为0,则入队列
int sum=0;
for(int i=0;i< book.length;i++)
{
if(book[i]==0) queue.add((char) (i+'a'));
if(book[i]!=0) sum++;
}
//计算拓扑排序
int index=0;
char res[]=new char[sum];
while (!queue.isEmpty())
{
char temp=queue.poll();
res[index++]=temp;
if(map.get(temp)!=null)
{
for(char nigb: map.get(temp))
{
book[nigb-'a']--;
if(book[nigb-'a']==0) queue.add(nigb);
}
}
}
return index==sum?new String(res):"";
}
}
算法小白,欢迎指教。