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. .NET Core开发实战(第35课:MediatR:让领域事件处理更加优雅)--学习笔记

    35 | MediatR:让领域事件处理更加优雅 核心对象 IMediator INotification INotificationHandler 这两个与之前的 Request 的行为是不一样的, ...

  2. NC16619 [NOIP2008]传球游戏

    题目链接 题目 题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏. 游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时 ...

  3. windows远程连接centos及闪退异常解决记录

     平时在学校实验室写代码用的环境是linux系统,放假回家之后之后笔记本的性能和系统多少有些不方便,因此使用服务器安装IDEA进行编程,记录一下远程桌面的安装及出现的问题解决. 一. 安装Centos ...

  4. 端口碰撞Port Knocking和单数据包授权SPA

    端口碰撞技术 Port knocking 从网络安全的角度,服务器开启的端口越多就越不安全,因此系统安全加固服务中最常用的方式,就是先关闭无用端口,再对提供服务的端口做访问控制.而作为远程管理与维护的 ...

  5. 【Unity3D】基于模板测试和顶点膨胀的描边方法

    1 前言 ​ 选中物体描边特效 中介绍了基于模板纹理模糊膨胀的描边方法,该方法实现了软描边,效果较好,但是为了得到模糊纹理,对屏幕像素进行了多次渲染,效率欠佳.本文将介绍另一种描边方法:基于模板测试和 ...

  6. ckeditor实战总结

    介绍 使用范围较广的富文本编辑器.官方文档 config.js的常用配置 参考:https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_conf ...

  7. 24个javascript最佳实践

    1. 使用 === 代替 == JavaScript utilizes two different kinds of equality operators: === | !== and == | != ...

  8. python第一章pta习题总结

    chapter 1 一.选择判断部分 1.高级语言程序要被机器执行,只有用解释器来解释执行.(F) 计算机高级语言按程序的执行方式可以分为编译型和解释型两种. 执行方式 跨平台 特点 缺点 代表语言 ...

  9. UtilMeta - 简洁高效的 Python 后端元框架

    最近开源了我开发多年的一个 Python 后端框架:UtilMeta 项目介绍 UtilMeta 是一个用于开发 API 服务的后端元框架,基于 Python 类型注解标准高效构建声明式接口与 ORM ...

  10. 图片Base64编码解码的优缺点及应用场景分析

    随着互联网的迅猛发展,图片在网页和移动应用中的使用越来越广泛.而图片的传输和加载往往是网页性能的瓶颈之一.为了解决这一问题,图片Base64编码与解码技术应运而生.本文将介绍图片Base64相互转换的 ...