当前位置: 首页 > article >正文

LeetCodeLCR 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) {
        int n = words.size();
        vector<int> indegree(26,-1);
        vector<vector<int>> graph;
        for(auto w:words){
            for(int i = 0;i < w.size();i++){
                indegree[w[i] - 'a'] = 0;
            }
        }
        int cnt = 0;
        for(int i = 0;i < 26;i++){
            if(indegree[i] == 0) cnt++;
        }
        for(int i = 0;i < 26;i++){
            graph.push_back({});
        }
        for(int i = 0;i < n - 1;i++){
            string cur = words[i];
            string next = words[i+1];
            int len = min(cur.size(),next.size());
            int j = 0;
            for(;j < len;j++){
                if(cur[j] != next[j]){
                    graph[cur[j] - 'a'].push_back(next[j] - 'a');
                    indegree[next[j] - 'a']++;
                    break;
                }
            }
            if(j < cur.size() && j == next.size()) return "";
        }
        string res = "";
        queue<int> q;
        for(int i = 0;i < 26;i++){
            if(indegree[i] == 0) q.push(i);
        }
        while(!q.empty()){
            int e = q.front();
            q.pop();
            res.push_back('a' + e);
            int size = graph[e].size();
            for(int i = 0;i < size;i++){
                indegree[graph[e][i]]--;
                if(indegree[graph[e][i]] == 0) q.push(graph[e][i]);
            }
        }
        if(res.size() == cnt) return res;
        else return "";
    }
};

http://www.kler.cn/a/230198.html

相关文章:

  • 【11-20期】Java面试进阶:深入解析核心问题与实战案例
  • 数据库(总结自小林coding)|索引失效的场景、慢查询、原因及如何优化?undo log、redo log、binlog 作用、MySQL和Redis的区别
  • H.265流媒体播放器EasyPlayer.js无插件H5播放器关于移动端(H5)切换网络的时候,播放器会触发什么事件
  • 【测试工具JMeter篇】JMeter性能测试入门级教程(一)出炉,测试君请各位收藏了!!!
  • 填补覆盖空白,小型机器人让智能清洁再“净”一步!
  • 101页PDF | 德勤_XX集团信息化顶层规划设计信息化总体解决方案(限免下载)
  • 【Scala 】3. 类和对象
  • Linux(三)--文件系统
  • linux中的gdb调试
  • 【Spring Boot】第一篇 创建简单的Spring Boot项目
  • [基础IO]文件描述符{重定向/perror/磁盘结构/inode/软硬链接}
  • homeword_day1
  • 高清符合要求的SCI图片使用RStudio导出
  • NLP_循环神经网络(RNN)
  • AES算法:数据传输的安全保障
  • 20240202在Ubuntu20.04.6下使用whisper.cpp的CPU模式
  • 用python编写爬虫,爬取房产信息
  • axios get 请求 url 转码 空格转成+,导致请求失败(前端解决)
  • 备战蓝桥杯---搜索(进阶3)
  • Unicode常用属性
  • WebChat——一个开源的聊天应用
  • 阿里云游戏服务器收费价格表,一年和1个月报价
  • Unity动画循环偏移的使用
  • Idea:Idea导入Module、子Module的方式及其可能遇到的问题
  • 【Flink入门修炼】1-2 Mac 搭建 Flink 源码阅读环境
  • 【python】绘制爱心图案