每日OJ题_BFS解决拓扑排序③_力扣LCR 114. 火星词典

embedded/2024/9/23 7:29:31/

目录

力扣LCR 114. 火星词典

解析代码


力扣LCR 114. 火星词典

LCR 114. 火星词典

难度 困难

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

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

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

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

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

示例 1:

输入:words = ["wrt","wrf","er","ett","rftt"]
输出:"wertf"

示例 2:

输入:words = ["z","x"]
输出:"zx"

示例 3:

输入:words = ["z","x","z"]
输出:""
解释:不存在合法字母顺序,因此返回 "" 。

提示:

  • 1 <= words.length <= 100
  • 1 <= words[i].length <= 100
  • words[i] 仅由小写英文字母组成
class Solution {
public:string alienOrder(vector<string>& words) {}
};

解析代码

将题意理解清楚之后,这道题就变成了判断有向图是否有环,可以用拓扑排序解决。

如何如搜集信息(何建图):

  1. 两层 for 循环枚举出所有的两个字符串的组合。
  2. 然后利用指针,根据字典序规则找出信息。
class Solution {unordered_map<char, unordered_set<char>> edges; // 邻接表unordered_map<char, int> in; // 统计入度信息bool flag; // 处理边界情况, 类似str1 = a, b, c && str2 = a, bpublic:string alienOrder(vector<string>& words) {for(auto& str : words) // 初始化入度哈希表{for(auto& ch : str){in[ch] = 0;}}int sz = words.size();for(int i = 0; i < sz; ++i) // 建图{for(int j = i + 1; j < sz; ++j){Add(words[i], words[j]);if(flag) // 不合法return "";}}queue<char> q; // 拓扑排序for(auto& [a, b] : in) // 入度为0的点入队列{if(b == 0)q.push(a);}string ret;while(!q.empty()){char tmp = q.front();q.pop();ret += tmp;for(auto& ch : edges[tmp]) // 度为0的点指向的点的度减1{if(--in[ch] == 0)q.push(ch);}}for(auto& [a, b] : in) // 返回{if(b != 0)return "";}return ret;}void Add(string& str1, string& str2) // 收集信息{int sz = min(str1.size(), str2.size()), i = 0;for(; i < sz; ++i){if(str1[i] != str2[i]){char a = str1[i], b = str2[i]; // 前大后小if(!edges.count(a) || !edges[a].count(b)) // 防止存入重复信息   {edges[a].insert(b);  // a -> bin[b]++;}break;}}if(i == str2.size() && i < str1.size())flag = true; // 类似str1 = a, b, c && str2 = a, b}
};


http://www.ppmy.cn/embedded/13095.html

相关文章

一u的高度,即 44毫米

一u的长度是在计算机科学里, 一个 U 是一层底盘的高度,即 44毫米 一寸一尺一丈长度 1、一寸一尺一丈是我国传统的长度单位&#xff0c;它们之间的关系是十进制。 2、1丈10尺&#xff0c;1尺10寸&#xff1b;1丈3.33米&#xff0c;1尺3.33分米&#xff0c;1寸3.33厘米。 3、…

【笔记】关于 RILJ 中 “< OPERATOR” 运营商名称来源代码流程

功能背景说明 分析日志中关于AT “< OPERATOR” 的运营商名称信息来源。 04-22 22:53:25.915403 2140 2140 D RILJ : [0209]> OPERATOR [PHONE0] 04-22 22:53:25.922854 2140 2157 D RILJ : [0209]< OPERATOR {telering, telering, 23207} [PHONE0] 与MD交…

Azure AKS集群监控告警表达式配置

背景需求 Azure AKS集群中&#xff0c;需要对部署的服务进行监控和告警&#xff0c;需要创建并启用预警规则&#xff0c;而这里怎么去监控每个pod级别的CPU和内存&#xff0c;需要自己写搜索查询 解决方法 搜索和查询的语句如下&#xff0c;需要自己替换其中的部分信息,其中…

【库函数】Linux下动态库.so和静态库.a的生成和使用

目录 &#x1f31e;1. Linux下静态库和动态库的基本概念 &#x1f31e;2. 动态库 &#x1f30a;2.1 动态库如何生成 &#x1f30d;2.1.1 文件详情 &#x1f30d;2.1.2 编译生成动态库 &#x1f30a;2.2 动态库如何使用 &#x1f30d;2.2.1 案例 &#x1f30d;2.2.2 动态…

OceanBase数据库日常运维快速上手

这里为大家汇总了从租户创建、连接数据库&#xff0c;到数据库的备份、归档、资源配置调整等&#xff0c;在OceanBase数据库日常运维中的操作指南。 创建租户 方法一&#xff1a;通过OCP 创建 确认可分配资源 想要了解具体可分配的内存量&#xff0c;可以通过【资源管理】功…

C++ | Leetcode C++题解之第46题全排列

题目&#xff1a; 题解&#xff1a; class Solution { public:void backtrack(vector<vector<int>>& res, vector<int>& output, int first, int len){// 所有数都填完了if (first len) {res.emplace_back(output);return;}for (int i first; i &…

java高级工程师面试题及答案解析干货汇总-MYSQL与SQLServer区别及其适用场景

SQLServer与MySQL区别及适用场景 1. SQLServer与MySQL的区别&#xff08;1&#xff09;许可与成本&#xff08;2&#xff09;性能与可扩展性&#xff08;3&#xff09;功能与特性&#xff08;4&#xff09;社区与支持 2. 优劣势分析SQLServer的优势MySQL的优势SQLServer的劣势M…

uniapp——组件多颜色模块展示、气泡框

一、自定义颜色&#xff1a; 样式 代码 <template><view class"content"><!-- 右上角 --><view class"coverStatus" :class"[itemClass, positionClass,cornerClass,sanJiaoCss,sanJiaoCss2]":style"dynamicStyle&q…