当前位置:网站首页>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;
}
参考
边栏推荐
- Some thoughts on writing
- 性能测试如何准备测试数据
- Mysql_12 多表查询
- OpenCV:10特征检测
- uniapp horizontal tab (horizontal scrolling navigation bar) effect demo (organization)
- 大师教你3D实时角色制作流程,游戏建模流程分享
- 3. Actual combat---crawl the result page corresponding to Baidu's specified entry (a simple page collector)
- 简单的顺序结构程序(C语言)
- SQL association table update
- jenkins send mail system configuration
猜你喜欢
what?测试/开发程序员要被淘汰了?年龄40被砍到了32?一瞬间,有点缓不过神来......
Xiaohei's leetcode journey: 95. Longest substring with at least K repeating characters
Mysql_13 事务
2022牛客暑期多校训练营5(BCDFGHK)
统计单词(DAY 101)华中科技大学考研机试题
【论文笔记】—低照度图像增强—Unsupervised—EnlightenGAN—2019-TIP
[Happy Qixi Festival] How does Nacos realize the service registration function?
Huggingface入门篇 II (QA)
golang 协程的实现原理
【LeetCode】图解 904. 水果成篮
随机推荐
测试经理要不要做测试执行?
Uniapp dynamic sliding navigation effect demo (finishing)
[Happy Qixi Festival] How does Nacos realize the service registration function?
线程三连鞭之“线程的状态”
2022牛客暑期多校训练营5(BCDFGHK)
2 用D435i运行VINS-fusion
3. Actual combat---crawl the result page corresponding to Baidu's specified entry (a simple page collector)
Basic web in PLSQL
.net(C#)获取两个日期间隔的年月日
数据类型-整型(C语言)
【七夕情人节特效】-- canvas实现满屏爱心
leetcode经典例题——单词拆分
Mysql_14 存储引擎
手写分布式配置中心(1)
学会反射后,我被录取了(干货)
矩阵数学原理
小黑leetcode之旅:95. 至少有 K 个重复字符的最长子串
安全软件 Avast 与赛门铁克诺顿 NortonLifeLock 合并案获英国批准,市值暴涨 43%
日志(logging模块)
图解 Canvas 入门