[剑指 Offer II 114. 外星文字典] 拓扑排序
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. 外星文字典] 拓扑排序的更多相关文章
- 刷题-力扣-剑指 Offer II 055. 二叉搜索树迭代器
剑指 Offer II 055. 二叉搜索树迭代器 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/kTOapQ 著作权归领扣网络所有 ...
- 【剑指 Offer II 001. 整数除法】同leedcode 29.两数相除
剑指 Offer II 001. 整数除法 解题思路 在计算的时候将负数转化为正数,对于32位整数而言,最小的正数是-2^31, 将其转化为正数是2^31,导致溢出.因此将正数转化为负数不会导致溢出. ...
- 剑指Offer(三十七):数字在排序数组中出现的次数
剑指Offer(三十七):数字在排序数组中出现的次数 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.n ...
- 剑指 Offer II Trie前缀树
初始化 数组初始化在class外的话 要memset 在主函数里面memset 在class内不用 062. 实现前缀树 class Trie { public: /** Initialize you ...
- 剑指 Offer II 动态规划
088. 爬楼梯的最少成本 class Solution { public: int minCostClimbingStairs(vector<int>& cost) { int ...
- 剑指 Offer II 回溯法
086. 分割回文子字符串 用substr枚举 因为是连续的 不是放与不放的问题 class Solution { public: vector<vector<string>> ...
- 剑指Offer——II平衡二叉树
class TreeNode: def __init__(self, x): self.val = x self.left = None self.right = None # 这道题使用中序遍历加上 ...
- 【力扣】剑指 Offer II 092. 翻转字符
题目 解题思路 一个很暴力的想法,在满足单调递增的前提下,使每一位分别取 1 或 0,去看看哪个结果小. 递归函数定义int dp(StringBuilder sb, int ind, int pre ...
- 剑指 Offer II 二分查找
068. 查找插入位置 class Solution { public: int searchInsert(vector<int>& nums, int target) { int ...
- 剑指 Offer II 堆
059. 数据流的第 K 大数值 class KthLargest { public: priority_queue<int,vector<int>,greater<int&g ...
随机推荐
- Matrix【未完成】
Matrix The fitrst thing we do,let's kill all the language lawyers. -- Henry VI, Part II The "pr ...
- yapi 启动后,老是自动关闭的问题。
解决方法只需要2步: 1.在命令后面加 & 符号,放到后台执行,最终的命令为: node /usr/local/yapi/yapi/vendors/server/app.js & 2. ...
- tmpwatch命令
tmpwatch命令 tmpwatch递归删除给定时间内未访问的文件,通常用于清理用于临时存放空间的目录,并可以设置文件超期时间,默认单位以小时计算. 语法 tmpwatch [-u | -m | - ...
- MySQL写入SQL整个执行流程
innodb存储引擎中一条sql写入的详细流程 第0步:会先去看缓冲区有没有这条数据,如果有就不进行缓存,直接进入第三步. 第1步:会将要修改的那一行数据所在的一整页加载到缓冲池Buffe ...
- win32-SetupDiSetClassInstallParamsW的使用
SetupDiSetClassInstallParams函数一般是用来禁用/启用某个设备 比如我们可以禁用网络适配器 /* for Devpkey */ #define INITGUID /* dep ...
- SVN培训笔记(下拉项目、同步修改、添加文件、修改文件、删除文件、改名文件等)
前言 为了方便新加入团队的员工熟悉团队协作开发. 为了将好东西整理分享给有需要的网友. 将SVN内部员工培训文档公开,以方便更多的人,提高知识获取速度,尽快熟悉协同开发. 本文档培训员工对于 ...
- 如何在矩池云上安装语音识别模型 Whisper
如何在矩池云上安装语音识别模型 Whisper Whisper 是 OpenAI 近期开源的一个语音识别的模型,研究人员基于 680,000 小时的标记音频数据进行训练,它同时也是一个多任务模型,可以 ...
- ClickHouse学习笔记--ClickHouse的整体特性
本文主要包含如下内容: ClickHouse适用场景 ClickHouse缺点 ClickHouse优点 ClickHouse表引擎-合并树 ClickHouse表引擎-合并树-稀疏索引 ClickH ...
- 解密Spring中的Bean实例化:推断构造方法(上)
在Spring中,一个bean需要通过实例化来获取一个对象,而实例化的过程涉及到构造方法的调用.本文将主要探讨简单的构造推断和实例化过程,让我们首先深入了解实例化的步骤. 实例化源码 protecte ...
- iOS使用Unity容器动态加载3D模型
项目背景 我们的APP是一个数字藏品平台,里面的很多藏品需要展示3D模型,3D模型里面可能会包含场景,动画,交互.而对应3D场景来说,考虑到要同时支持iOS端,安卓端,Unity是个天然的优秀方案. ...