import java.util.*;

class Solution {
public static void main(String[] args) {
Solution solution = new Solution();
System.out.println(solution.alienOrder(new String[]{
"ac","ab","zc","zb"
}));
}
public String alienOrder(String[] words) {
int len = words.length;
Set<Integer> flag = new HashSet<>();
for (int i = 0; i < len; i++) {
for(int j =0;j<words[i].length();j++){
flag.add(words[i].charAt(j)-'a');
}
}
Set<Integer>[] g = new HashSet[26];
Arrays.setAll(g,e->new HashSet<>());
int[] ingress = new int[26];
Set<List<Integer>> edge = new HashSet<>();
for(int i = 0;i<len-1;i++){
String a = words[i];
String b = words[i+1]; int alen = a.length();
int blen = b.length();
int min = Math.min(alen,blen); boolean find = false;
int j = 0;
for(j=0;j<min;j++){
if( a.charAt(j) != b.charAt(j)){
find = true;
break;
}
} if(!find ) {
if(alen > blen){
return "";
}
}else{
int d1 = a.charAt(j) - 'a';
int d2 = b.charAt(j) - 'a'; g[d1].add(d2);
if(!edge.contains(Arrays.asList(d1,d2))) {
ingress[d2]++;
edge.add(Arrays.asList(d1,d2));
}
}
} StringBuilder ans = build(g,ingress,flag);
return ans.toString();
} public StringBuilder build(Set<Integer>[] g,int[] ingress,Set<Integer> flag) {
ArrayDeque<Integer> queue = new ArrayDeque<Integer>();
for (int i = 0; i < 26; i++) {
if (flag.contains(i) && ingress[i] == 0) {
queue.offer(i);
}
} StringBuilder sb = new StringBuilder();
while (!queue.isEmpty()) {
int u = queue.poll();
if (ingress[u] == 0) {
sb.append((char) ('a' + u));
}
for (Integer v : g[u]) {
ingress[v]--;
if (ingress[v] == 0) {
queue.offer(v);
}
}
} if( flag.size() != sb.length()) {
return new StringBuilder("");
}
return sb;
}
}

[剑指 Offer II 114. 外星文字典] 拓扑排序的更多相关文章

  1. 刷题-力扣-剑指 Offer II 055. 二叉搜索树迭代器

    剑指 Offer II 055. 二叉搜索树迭代器 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/kTOapQ 著作权归领扣网络所有 ...

  2. 【剑指 Offer II 001. 整数除法】同leedcode 29.两数相除

    剑指 Offer II 001. 整数除法 解题思路 在计算的时候将负数转化为正数,对于32位整数而言,最小的正数是-2^31, 将其转化为正数是2^31,导致溢出.因此将正数转化为负数不会导致溢出. ...

  3. 剑指Offer(三十七):数字在排序数组中出现的次数

    剑指Offer(三十七):数字在排序数组中出现的次数 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.n ...

  4. 剑指 Offer II Trie前缀树

    初始化 数组初始化在class外的话 要memset 在主函数里面memset 在class内不用 062. 实现前缀树 class Trie { public: /** Initialize you ...

  5. 剑指 Offer II 动态规划

    088. 爬楼梯的最少成本 class Solution { public: int minCostClimbingStairs(vector<int>& cost) { int ...

  6. 剑指 Offer II 回溯法

    086. 分割回文子字符串 用substr枚举 因为是连续的 不是放与不放的问题 class Solution { public: vector<vector<string>> ...

  7. 剑指Offer——II平衡二叉树

    class TreeNode: def __init__(self, x): self.val = x self.left = None self.right = None # 这道题使用中序遍历加上 ...

  8. 【力扣】剑指 Offer II 092. 翻转字符

    题目 解题思路 一个很暴力的想法,在满足单调递增的前提下,使每一位分别取 1 或 0,去看看哪个结果小. 递归函数定义int dp(StringBuilder sb, int ind, int pre ...

  9. 剑指 Offer II 二分查找

    068. 查找插入位置 class Solution { public: int searchInsert(vector<int>& nums, int target) { int ...

  10. 剑指 Offer II 堆

    059. 数据流的第 K 大数值 class KthLargest { public: priority_queue<int,vector<int>,greater<int&g ...

随机推荐

  1. (C语言)每日代码||2024.1.10||scanf("%6f",&a)

    #include <stdio.h> int main() { float a; scanf("%.3f", &a);//输入1234 printf(" ...

  2. 《ASP.NET Core 微服务实战》-- 读书笔记(第9章)

    第 9 章 微服务系统的配置 微服务系统中的配置需要关注更多其他方面的因素,包括: 配置值的安全读写 值变更的审计能力 配置信息源本身的韧性和可靠性 少量的环境变量难以承载大型.复杂的配置信息 应用要 ...

  3. MySQL-顺序IO和随机IO的区别

    顺序IO是指读写操作的访问地址连续.在顺序IO访问中,HDD所需的磁道搜索时间显着减少,因为读/写磁头可以以最⼩的移动访问下一个块.数据备份和日志记录等业务是顺序IO业务.随机IO是指读写操作时间连续 ...

  4. 云计算 - 负载均衡SLB方案全解与实战

    云计算 - 负载均衡SLB方案全解与实战,介绍SLB的核心技术.用户最佳实践.阿里云 SLB产品举例.应用场景. 关注[TechLeadCloud],分享互联网架构.云服务技术的全维度知识.作者拥有1 ...

  5. NEMU PA 3-2 实验报告

    一.实验目的 在上一章节我们完成了Cache的实现,但是这只是在速度上提高了取指和存取操作数的效率,而在访问的安全性上没有得到有效提升. 在PA3-2中我们要完成的,就是在NEMU中实现分段机制. 二 ...

  6. NC25084 [USACO 2006 Nov S]Bad Hair Day

    题目 题目描述 Some of Farmer John's N cows (1 ≤ N ≤ 80,000) are having a bad hair day! Since each cow is s ...

  7. Linux操作系统下查询NVMe盘符、Slot ID和Bus ID的对应关系

    在拆卸NVMe PCIe 固态硬盘时,需要查询Linux操作系统下NVMe盘符.Slot ID和Bus ID的对应关系. 操作步骤打开操作系统命令终端.依次执行cd /sys/bus/pci/slot ...

  8. Linux常用的20个命令(下)

    无论你是后端程序员还是前端程序员,都避免不了和Linux打交道.上篇介绍了Linux常用的20个命令其中的10个,本文继续介绍剩下的10个命令. 11.man 命令 manual的缩写,即使用手册的意 ...

  9. 【Unity3D】使用GL绘制线段

    1 前言 ​ 线段渲染器LineRenderer.拖尾TrailRenderer.绘制物体表面三角形网格从不同角度介绍了绘制线段的方法,本文再介绍一种新的绘制线段的方法:使用 GL 绘制线段. ​ G ...

  10. 基于tensorflow的RBF神经网络案例

    1 前言 在使用RBF神经网络实现函数逼近中,笔者介绍了使用 Matlab 训练RBF神经网络.本博客将介绍使用 tensorflow 训练RBF神经网络.代码资源见:RBF案例(更新版) 这几天,笔 ...