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

给定一个字符串列表 words ,作为这门语言的词典,words 中的字符串已经 按这门新语言的字母顺序进行了排序 。

请你根据该词典还原出此语言中已知的字母顺序,并 按字母递增顺序 排列。若不存在合法字母顺序,返回 "" 。若存在多种可能的合法字母顺序,返回其中 任意一种 顺序即可。

字符串 s 字典顺序小于 字符串 t 有两种情况:

在第一个不同字母处,如果 s 中的字母在这门外星语言的字母顺序中位于 t 中字母之前,那么 s 的字典顺序小于 t 。
如果前面 min(s.length, t.length) 字母都相同,那么 s.length < t.length 时,s 的字典顺序也小于 t 。

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


拓扑排序+dfs,较难,参考了题解

class Solution {
public:enum {VISITING = 1,VISITED};unordered_map<char, vector<char>> edges;unordered_map<char, int> states;bool valid = true;int index = 0;string ans;string alienOrder(vector<string>& words) {int l = words.size();for (string& word : words) {int len = word.size();for (int j = 0; j < len; j++) {char c = word[j];if (!edges.count(c))edges[c] = vector<char>();}}for (int i = 1; i < l && true; i++) addEdge(words[i - 1], words[i]);ans = string(edges.size(), ' ');index = edges.size() - 1;for (auto [u, v] : edges) if (!states.count(u)) dfs(u);if (!valid) return "";return ans;}void addEdge(string s1, string s2) {int len1 = s1.size();int len2 = s2.size();int min_len = min(len1, len2);int i = 0;for (i = 0; i < min_len; i++) {char c1 = s1[i];char c2 = s2[i];if (c1 != c2) {edges[c1].emplace_back(c2);break;}}if (i == min_len && len1 > len2)valid = false;}void dfs(char u) {states[u] = VISITING;for (char v : edges[u]) {if (!states.count(v)) {dfs(v);if (!valid) return;} else if (states[v] == VISITING) {valid = false;return;}}states[u] = VISITED;ans[index] = u;index--;}
};

LeetCode每日一题(2022/5/31)剑指 Offer II 114. 外星文字典(困难)相关推荐

  1. 剑指 Offer II 114. 外星文字典(困难 图 bfs 哈希表 拓扑排序 字符串 数组)

    剑指 Offer II 114. 外星文字典 现有一种使用英语字母的外星文语言,这门语言的字母顺序与英语顺序不同. 给定一个字符串列表 words ,作为这门语言的词典,words 中的字符串已经 按 ...

  2. ​力扣解法汇总-剑指 Offer II 114. 外星文字典

    目录链接: 力扣编程题-解法汇总_分享+记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接:力扣 描 ...

  3. Leetcode刷题笔记——剑指offer II (六)【图】

    文章目录 图 695. 岛屿的最大面积 剑指 Offer II 106. 二分图 (每条边的两个结点都来自不同的集合) 剑指 Offer II 107. 矩阵中的距离 (最短路问题,建图,BFS) 剑 ...

  4. Leetcode刷题笔记——剑指offer II (五)【二分、排序、回溯】

    这里写目录标题 二分查找 剑指 Offer II 069. 山峰数组的顶部 剑指 Offer II 070. 排序数组中只出现一次的数字 剑指 Offer II 071. 按权重生成随机数 剑指 Of ...

  5. leetcode每日一题--前缀树;前缀哈希;深搜;面试题 08.04. 幂集;648. 单词替换面试题 01.09. 字符串轮转;剑指 Offer II 062. 实现前缀树

    leetcode每日一题 ps:今天的每日一题没意思,简单的模拟,自己换一道 面试题 08.04. 幂集 幂集.编写一种方法,返回某集合的所有子集.集合中不包含重复的元素. 说明:解集不能包含重复的子 ...

  6. Leetcode刷题笔记——剑指offer II (一)【整数、数组、字符串、链表】

    目录 整数 剑指 Offer II 001. 整数除法 剑指 Offer II 002. 二进制加法 剑指 Offer II 003. 前 n 个数字二进制中 1 的个数 剑指 Offer II 00 ...

  7. 【算法leetcode每日一练】剑指 Offer II 080. 含有 k 个元素的组合 | 77. 组合

    文章目录 剑指 Offer II 080. 含有 k 个元素的组合 | 77. 组合: 样例 1: 样例 2: 提示: 分析 题解 java c c++ python go rust javascri ...

  8. LeetCode Algorithm 剑指 Offer II 056. 二叉搜索树中两个节点之和

    剑指 Offer II 056. 二叉搜索树中两个节点之和 Ideas 这题有点类似一个组合题,首先是通过二叉树遍历得到一个序列,然后再通过LeetCode Algorithm 1. 两数之和的方法查 ...

  9. LeetCode 21.23.剑指 Offer II 078. 合并两个有序链表 | C语言版

    LeetCode 21. 合并两个有序链表 | C语言版 LeetCode 21. 合并两个有序链表 题目描述 解题思路 思路一:使用栈 代码实现 运行结果 参考文章: 思路二:减少遍历节点数 代码实 ...

最新文章

  1. python与vb可以互换吗_vb能配合python写程序么?
  2. 解决maven创建web项目过慢的问题
  3. 自定义注解:通过监控文件的变化,实时更改工厂管理的实例
  4. php simpledateformat,Java中SimpleDateFormat的用法介绍(代码示例)
  5. 2017/06/23 linux软件管理构建本地源
  6. centos 关闭防火墙_CentOS7操作系统下如何关闭防火墙
  7. css渲染(一) 字体
  8. 著名风投Greylock扩展基金局限 投资科技行业
  9. mindray心电监护仪使用说明_界面张力仪的使用步骤以及画面清晰度相关说明
  10. 科学技术是对人类历史发展和现代国家兴亡起决定作用的一种力量
  11. 只你一招,解决NAS噪音及速度问题!
  12. ubuntu系统中的好用的键盘指法及打字练习软件
  13. SEO工具:免费快速排名软件大全!
  14. 外星人 AW3423DWF 评测
  15. 新猿木子李:0基础学python培训教程 Python操作Excel之格式转换
  16. html字体样式(2)
  17. 唯一历经五朝的皇妃,其印鉴藏于天津博物馆
  18. JackKnife开发专题-方便快捷的IOC框架
  19. 如何批量输出条形码图片
  20. Linux ssh远程连接

热门文章

  1. Canvas像素调节—调节图片的明暗与对比度
  2. win10连接打印机共享显示0x0000011b错误代码怎么办?
  3. 魔法java_力量与魔法java
  4. WebService SOAP XML 与 REST JSON 架构的比较
  5. 科技是唯一可叠加式进步的动力
  6. autogloun自然语言处理
  7. 将字符串“abc123“转化为 字符串“a21cb3“JAVA实现
  8. 数理统计笔记7:分类数据分析-拟合优度检验和列联分析
  9. 模仿京东-商品详情页前端样式 CSS+html+js
  10. 垃圾收集器调优相关参数