LeetCode每日一题(2022/5/31)剑指 Offer II 114. 外星文字典(困难)
现有一种使用英语字母的外星文语言,这门语言的字母顺序与英语顺序不同。
给定一个字符串列表 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. 外星文字典(困难)相关推荐
- 剑指 Offer II 114. 外星文字典(困难 图 bfs 哈希表 拓扑排序 字符串 数组)
剑指 Offer II 114. 外星文字典 现有一种使用英语字母的外星文语言,这门语言的字母顺序与英语顺序不同. 给定一个字符串列表 words ,作为这门语言的词典,words 中的字符串已经 按 ...
- 力扣解法汇总-剑指 Offer II 114. 外星文字典
目录链接: 力扣编程题-解法汇总_分享+记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接:力扣 描 ...
- Leetcode刷题笔记——剑指offer II (六)【图】
文章目录 图 695. 岛屿的最大面积 剑指 Offer II 106. 二分图 (每条边的两个结点都来自不同的集合) 剑指 Offer II 107. 矩阵中的距离 (最短路问题,建图,BFS) 剑 ...
- Leetcode刷题笔记——剑指offer II (五)【二分、排序、回溯】
这里写目录标题 二分查找 剑指 Offer II 069. 山峰数组的顶部 剑指 Offer II 070. 排序数组中只出现一次的数字 剑指 Offer II 071. 按权重生成随机数 剑指 Of ...
- leetcode每日一题--前缀树;前缀哈希;深搜;面试题 08.04. 幂集;648. 单词替换面试题 01.09. 字符串轮转;剑指 Offer II 062. 实现前缀树
leetcode每日一题 ps:今天的每日一题没意思,简单的模拟,自己换一道 面试题 08.04. 幂集 幂集.编写一种方法,返回某集合的所有子集.集合中不包含重复的元素. 说明:解集不能包含重复的子 ...
- Leetcode刷题笔记——剑指offer II (一)【整数、数组、字符串、链表】
目录 整数 剑指 Offer II 001. 整数除法 剑指 Offer II 002. 二进制加法 剑指 Offer II 003. 前 n 个数字二进制中 1 的个数 剑指 Offer II 00 ...
- 【算法leetcode每日一练】剑指 Offer II 080. 含有 k 个元素的组合 | 77. 组合
文章目录 剑指 Offer II 080. 含有 k 个元素的组合 | 77. 组合: 样例 1: 样例 2: 提示: 分析 题解 java c c++ python go rust javascri ...
- LeetCode Algorithm 剑指 Offer II 056. 二叉搜索树中两个节点之和
剑指 Offer II 056. 二叉搜索树中两个节点之和 Ideas 这题有点类似一个组合题,首先是通过二叉树遍历得到一个序列,然后再通过LeetCode Algorithm 1. 两数之和的方法查 ...
- LeetCode 21.23.剑指 Offer II 078. 合并两个有序链表 | C语言版
LeetCode 21. 合并两个有序链表 | C语言版 LeetCode 21. 合并两个有序链表 题目描述 解题思路 思路一:使用栈 代码实现 运行结果 参考文章: 思路二:减少遍历节点数 代码实 ...
最新文章
- python与vb可以互换吗_vb能配合python写程序么?
- 解决maven创建web项目过慢的问题
- 自定义注解:通过监控文件的变化,实时更改工厂管理的实例
- php simpledateformat,Java中SimpleDateFormat的用法介绍(代码示例)
- 2017/06/23 linux软件管理构建本地源
- centos 关闭防火墙_CentOS7操作系统下如何关闭防火墙
- css渲染(一) 字体
- 著名风投Greylock扩展基金局限 投资科技行业
- mindray心电监护仪使用说明_界面张力仪的使用步骤以及画面清晰度相关说明
- 科学技术是对人类历史发展和现代国家兴亡起决定作用的一种力量
- 只你一招,解决NAS噪音及速度问题!
- ubuntu系统中的好用的键盘指法及打字练习软件
- SEO工具:免费快速排名软件大全!
- 外星人 AW3423DWF 评测
- 新猿木子李:0基础学python培训教程 Python操作Excel之格式转换
- html字体样式(2)
- 唯一历经五朝的皇妃,其印鉴藏于天津博物馆
- JackKnife开发专题-方便快捷的IOC框架
- 如何批量输出条形码图片
- Linux ssh远程连接
热门文章
- Canvas像素调节—调节图片的明暗与对比度
- win10连接打印机共享显示0x0000011b错误代码怎么办?
- 魔法java_力量与魔法java
- WebService SOAP XML 与 REST JSON 架构的比较
- 科技是唯一可叠加式进步的动力
- autogloun自然语言处理
- 将字符串“abc123“转化为 字符串“a21cb3“JAVA实现
- 数理统计笔记7:分类数据分析-拟合优度检验和列联分析
- 模仿京东-商品详情页前端样式 CSS+html+js
- 垃圾收集器调优相关参数