当前位置:网站首页>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;
}
参考
边栏推荐
- 论文解读( AF-GCL)《Augmentation-Free Graph Contrastive Learning with Performance Guarantee》
- After another 3 days, I have sorted out 90 NumPy examples, and I can't help but bookmark it!
- Uniapp dynamic sliding navigation effect demo (finishing)
- 中日颜色风格
- 隐私计算综述
- Flutter启动流程(Skia引擎)介绍与使用
- Develop a SpaceX website based on the Appian low-code platform
- 矩阵数学原理
- 三大技巧让你成功入门3D建模,零基础小白必看
- Ab3d.PowerToys and Ab3d.DXEngine Crack
猜你喜欢

Ab3d.PowerToys and Ab3d.DXEngine Crack

Security software Avast and Symantec NortonLifeLock merge with UK approval, market value soars 43%

STC89C52RC的P4口的应用问题

How to burn the KT148A voice chip into the chip through the serial port and the tools on the computer
Handwritten Distributed Configuration Center (1)

uniapp sharing function - share to friends group chat circle of friends effect (sorting)

Nuclei (2) Advanced - In-depth understanding of workflows, Matchers and Extractors

招标公告 | 海纳百创公众号运维项目

隐私计算综述

The master teaches you the 3D real-time character production process, the game modeling process sharing
随机推荐
如何写好测试用例
怎么将自己新文章自动推送给自己的粉丝(巨简单,学不会来打我)
OpenCV:10特征检测
VMware NSX 4.0 -- 网络安全虚拟化平台
【LeetCode】Summary of Two Pointer Problems
Senior game modelers tell newbies, what are the necessary software for game scene modelers?
数据类型及输入输出初探(C语言)
三大技巧让你成功入门3D建模,零基础小白必看
4 - "PyTorch Deep Learning Practice" - Backpropagation
uinty lua 关于异步函数的终极思想
对写作的一些感悟
在线中文姓名生成工具推荐
Detailed explanation of common DNS resource record types
lua 如何 实现一个unity协程的工具
2022年华数杯数学建模
Security software Avast and Symantec NortonLifeLock merge with UK approval, market value soars 43%
大师教你3D实时角色制作流程,游戏建模流程分享
Statistical words (DAY 101) Huazhong University of Science and Technology postgraduate examination questions
Couple Holding Hands [Greedy & Abstract]
图解 Canvas 入门