当前位置:网站首页>leetcode:269. 火星词典
leetcode:269. 火星词典
2022-08-05 00:10:00 【OceanStar的学习笔记】
题目来源
题目描述
现有一种使用英语字母的火星语言,这门语言的字母顺序与英语顺序不同。
给你一个字符串列表 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] 仅由小写英文字母组成
思路
思路
- 可以先根据word生成一张图
- 比较相邻两个words,逐个比较两个words相同位置的字符,直到找到第一个字符不相同的位置
- 这个位置的两个字符我们可以获得有效信息,也就是这两个字符在alien order中的相对顺序
- 需要注意的是也就是这个位置有用,因为后面的不同位置我们无法获取任何信息。
- 然后看拓扑排序,不能有环
举个例子
比如题目中给的例子1,可以推出的顺序关系有
t->f
w->e
r->t
e->r
实现
class Solution {
public:
std::string alienOrder(vector<std::string>& words) {
if(words.empty()){
return "";
}
int N = words.size();
// 将出现过的字符的入度设定为0
// 没有出现的字母入度为-1,出现了的字母的入度为非负数
std::map<char, int> indegree;
for (int i = 0; i < N; ++i) {
for(char ch : words[i]){
indegree[ch] = 0;
}
}
std::map<char, std::set<char>> graph;
for (int i = 0; i < N - 1; ++i) {
std::string curr = words[i];
std::string next = words[i + 1];
int len = std::min(curr.length(), next.length());
int j = 0;
for(;j < len; j++){
// # 保存第一个不同的字符顺序,位于前面的字母作为key,位于后面的字母存到set中作为值
if(curr[j] != next[j]){
if(!graph[curr[j]].count(next[j])){
graph[curr[j]].emplace(next[j]);
indegree[next[j]]++;
}
break;
}
}
// a 的字母排列顺序优先于 b,那么在给定的词典当中 a 定先出现在 b 前面
if(j < curr.length() && j == next.length()){
return ""; //前面都一样,cur字符更长,next没有字符了----说明给出的字典就不对
}
}
std::queue<char> q;
for(auto it : indegree){
char key = it.first;
if(indegree[key] == 0){
q.push(key);
}
}
std::string ans;
while (!q.empty()){
char curr = q.front(); q.pop();
ans += curr;
if(graph.count(curr)){
for(char next : graph[curr]){
--indegree[next];
if(indegree[next] == 0){
q.push(next);
}
}
}
}
return ans.length() == indegree.size() ? ans : "";
}
};
测试
int main() {
std::vector<std::string> vec {
"wrt",
"wrf",
"er",
"ett",
"rftt"};
Solution a;
auto v = a.alienOrder(vec) ;
printf("%s\n", v.c_str());
return 1;
}
参考
边栏推荐
- 怎样进行在不改变主线程执行的时候,进行日志的记录
- 从单体架构迁移到 CQRS 后,我觉得 DDD 并不可怕
- 2022年华数杯数学建模
- 【Valentine's Day special effects】--Canvas realizes full screen love
- 软件质量评估的通用模型
- KT6368A Bluetooth certification problem_FCC and BQB_CE_KC certification or other instructions
- jenkins发送邮件系统配置
- IDEA 文件编码修改
- The role of @Async annotation and how to implement asynchronous listening mechanism
- 入门3D游戏建模师知识必备
猜你喜欢
学会反射后,我被录取了(干货)
软件开发工具的技术要素
刘润直播预告 | 顶级高手,如何创造财富
【云原生--Kubernetes】调度约束
如何写好测试用例
Senior game modelers tell newbies, what are the necessary software for game scene modelers?
uniapp horizontal tab (horizontal scrolling navigation bar) effect demo (organization)
Basic web in PLSQL
三、实战---爬取百度指定词条所对应的结果页面(一个简单的页面采集器)
First, the basic concept of reptiles
随机推荐
数据类型及输入输出初探(C语言)
没有这些「伪需求」,产品经理的 KPI 怎么完成?
~ hand AHB - APB Bridge 】 【 AMBA AHB bus
【无标题】
typeScript - Partially apply a function
对写作的一些感悟
【云原生--Kubernetes】Pod控制器
Mysql based
The role of the annotation @ EnableAutoConfiguration and how to use
uniapp动态实现滑动导航效果demo(整理)
The role of @ Import annotations as well as how to use
2 用D435i运行VINS-fusion
MAUI Blazor 权限经验分享 (定位,使用相机)
Three tips for you to successfully get started with 3D modeling
Getting started with 3D modeling for games, what modeling software can I choose?
Detailed explanation of common DNS resource record types
LeetCode Hot 100
标识符、关键字、常量 和变量(C语言)
网站最终产品页使用单一入口还是多入口?
2022年华数杯数学建模