文章目录

  • 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. Java:基础面试题
  2. boost::ReadablePropertyMapConcept用法的测试程序
  3. 制作模块-制作模块压缩包
  4. Android下载文件
  5. 图(用list邻接表表示)的深度优先和广度优先(递归和非递归实现)
  6. android自定义ClockView
  7. 2021年高压电工考试技巧及高压电工复审模拟考试
  8. vue使用coreUI的CDataTable踩坑记录
  9. 超细!详解AD13:如何从零开始画出一个PCB(电路板)
  10. Linux系统管理员对普通用户的基本操作
  11. 【大厂面试】面试官看了赞不绝口的Redis笔记(三)分布式篇
  12. 华硕ROG|玩家国度魔霸新锐2023 Windows11原厂预装系统 工厂模式恢复安装带ASUSRecevory一键还原
  13. Airflow Timezone
  14. 中职计算机英语教师教学总结,中职教师工作总结
  15. 实验 9 音频信号采集及处理
  16. 好的大创计算机类课题,年电信学院大创项目选题清单.xlsx
  17. python计算电费
  18. HTML浏览器解析位置错误,各浏览器对CSS错误解析规则的差异及CSS hack.pdf
  19. 弘辽科技:店铺运营基本基础维护
  20. 什么输入法对计算机英语,电脑输入法不见了,只能打英文怎么处理

热门文章

  1. HTML块,含样式的标签
  2. Python面向切面编程是什么
  3. 如何在一个html页面中提交两个post,如何在同一个页面上从Django和Ajax获得多个post请求?...
  4. 热血街头Java,下载_我爱法语 V3.01 多国语言版_6z6z下载站
  5. vue大括号里接受一个函数_vue源码探究(第四弹)
  6. iOS 抓包工具 charles工具
  7. 引用js_js值和引用
  8. android收入管理系统,毕业设计(论文)-基于Android系统的家庭理财通软件的设计——收入管理模块.docx...
  9. 与fastboot相关的知识
  10. 计算机电缆 耐火,耐火计算机电缆ZR-NH-DJVVP