文章目录

  • 1. 题目
  • 2. 解题

1. 题目

现有一种使用字母的全新语言,这门语言的字母顺序与英语顺序不同。

假设,您并不知道其中字母之间的先后顺序。
但是,会收到词典中获得一个 不为空的 单词列表。
因为是从词典中获得的,所以该单词列表内的单词已经 按这门新语言的字母顺序进行了排序。

您需要根据这个输入的列表,还原出此语言中已知的字母顺序。

示例 1:
输入:
["wrt","wrf","er","ett","rftt"
]
输出: "wertf"示例 2:
输入:
["z","x"
]
输出: "zx"示例 3:
输入:
["z","x","z"
]
输出: ""
解释: 此顺序是非法的,因此返回 ""。提示:
你可以默认输入的全部都是小写字母
若给定的顺序是不合法的,则返回空字符串即可
若存在多种可能的合法字母顺序,请返回其中任意一种顺序即可

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/alien-dictionary
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

参考:图Graph–拓扑排序(Topological Sorting)

  • 建立第一个不相同的字符之间的有向图的边
  • 记录节点的入度,把入度为0的点入队BFS
class Solution {public:string alienOrder(vector<string>& words) {unordered_set<char> allchar;for(string& w : words){for(char ch : w)allchar.insert(ch);}//记下所有的字符unordered_map<char,int> indegree;unordered_map<char,unordered_set<char>> graph;int n1, n2, n;for(int i = 1, j; i < words.size(); ++i){ if(words[i-1] == words[i])continue;n1 = words[i-1].size();n2 = words[i].size();n = min(n1, n2);for(j = 0; j < n; ++j){if(words[i-1][j] != words[i][j]){ //不相等的第一个构成有向图的边if(!graph.count(words[i-1][j]) || !graph[words[i-1][j]].count(words[i][j])){   //防止重复添加同一条边 "za","zb","ca","cb"graph[words[i-1][j]].insert(words[i][j]);indegree[words[i][j]]++;indegree[words[i-1][j]] += 0;}break;}}if(j == n && n1 > n2)return "";//前面相等,前者长不行}queue<char> q;for(auto it = indegree.begin(); it != indegree.end(); ++it){if(it->second == 0)//入度为0的入队q.push(it->first);}string ans;while(!q.empty()){char ch = q.front();allchar.erase(ch);q.pop();ans += ch;for(auto it = graph[ch].begin(); it != graph[ch].end(); ++it){if(--indegree[*it] == 0)q.push(*it);}}if(ans.size() != indegree.size())return "";//有环while(allchar.size()){   //剩余字符随便放ans += *allchar.begin();allchar.erase(allchar.begin());}return ans;}
};

4 ms 7.2 MB


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!

LeetCode 269. 火星词典(拓扑排序)相关推荐

  1. LeetCode Course Schedule II(拓扑排序)

    问题:给出个课程个数,及前提条件对[v,u],即修课程v之前需要修课程u,如果可以输出修的课程顺序 思路: 对于有向图的拓扑排序 一种方式是使用dfs,访问结点的状态分为三种,white,gray,b ...

  2. LeetCode 207. 课程表(拓扑排序)

    1. 题目 你这个学期必须选修 numCourse 门课程,记为 0 到 numCourse-1 . 在选修某些课程之前需要一些先修课程. 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个 ...

  3. Leetcode 1436旅行终点站 拓扑排序 并查集与队列

    题目介绍 题目难度: easy 给你一份旅游线路图,该线路图中的旅行线路用数组 paths 表示,其中 paths[i] = [cityAi, cityBi] 表示该线路将会从 cityAi 直接前往 ...

  4. leetcode 1203. 项目管理(拓扑排序)

    公司共有 n 个项目和 m 个小组,每个项目要不无人接手,要不就由 m 个小组之一负责. group[i] 表示第 i 个项目所属的小组,如果这个项目目前无人接手,那么 group[i] 就等于 -1 ...

  5. LeetCode Minimum Height Trees(拓扑排序)

    问题:给出一个图,要求确定树的根,使得树的高度最小. 思路:先求出结点的度.然后将度数为1的入队列.在出队列时,将其邻接结点的度数减1,如果度数为1,则放入队列.直接剩余的结点数小于等于2 具体代码参 ...

  6. LeetCode 210. 课程表 II(拓扑排序)

    1. 题目 现在你总共有 n 门课需要选,记为 0 到 n-1. 在选修某些课程之前需要一些先修课程. 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1] 给定课 ...

  7. 拓扑排序之java实现_有向图和拓扑排序Java实现

    package practice; import java.util.ArrayDeque; import java.util.Iterator; import java.util.Stack; pu ...

  8. leetcode阶段总结——拓扑排序

    leetcode阶段总结--拓扑排序 leetcode中经常出现的题型之一.其中,拓扑排序的概念可以参考这里,这里主要总结一下前300题中出现的几个关于拓扑排序的题,以待之后复习的时候查找. leet ...

  9. LeetCode 207. Course Schedule--有向图找环--面试算法题--DFS递归,拓扑排序迭代--Python

    题目地址:Course Schedule - LeetCode There are a total of n courses you have to take, labeled from 0 to n ...

最新文章

  1. python如何训练模型生产_手把手教你用Python构建你的第一个多标签图像分类模型(附案例)...
  2. 【spring boot】使用RestTemplate调用百度坐标转换服务
  3. 前端学习(2761):uni-app样式的学习
  4. x264里的2pass指的是什么意思? x264源代码分析2.encode()
  5. 一文了解Redis持久化
  6. python编程(GUI线程和工作线程的同步)
  7. oracle归档日志太多(ORA-00257: archiver error. Connect internal only, until freed)错误的处理方法
  8. 【转载】C#反射 获取程序集信息和通过类名创建类实例(转载)
  9. java分布式面试题_2021,Java最全的分布式面试题合集附答案,共2w字!
  10. 华为手机屏幕锁屏时间设置_华为手机自动锁屏时间设置
  11. iOS 应用下载链接获取
  12. 《Redis视频教程》(p20)
  13. 201671030113 词频统计软件项目报告
  14. 群发邮件避免被识别为垃圾邮件
  15. fabric 1.3.1 ,全手动部署到5台机器上.支持 kafka 模式的共识机制和 couchdb 存储,以及 fabric ca , fabric explorer的使用
  16. php eval()函数
  17. 保龄球计分c语言程序,求C语言代码解释(保龄球记分程序)
  18. 网络号,网络标识,广播地址,有效主机范围计算
  19. 架构升级、性能优化,高德技术专家 infoQ 全球架构师峰会开讲啦
  20. ROS2机器人操作系统简介2021英文字幕版本

热门文章

  1. java启动密码,java - 用户验证密码后如何启动java applet程序? - SO中文参考 - www.soinside.com...
  2. 898 C. Phone Numbers
  3. django 403 错误:CSRF token missing or incorrect
  4. The Shapes of CSS
  5. Linux 中的各种栈:进程栈 线程栈 内核栈 中断栈
  6. Linux内核品读 /基础组件/ 模块机制快速入门
  7. 嵌入式linux文件系统
  8. 分号是不是c语言的一部分,问什么C程序里总是提示缺少分号;,而明明有分号?...
  9. python求回数_用python求回数
  10. linux java远程调试_idea远程linux代码调试