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 "";
    }
};

相关推荐

  1. LeetCodeLCR 114. 火星词典——拓扑排序

    2024-02-08 00:38:01       51 阅读
  2. 【Leetcode】269.火星词典(Hard)

    2024-02-08 00:38:01       50 阅读
  3. 【模板】拓扑排序

    2024-02-08 00:38:01       63 阅读
  4. 【算法】拓扑排序

    2024-02-08 00:38:01       47 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-08 00:38:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-08 00:38:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-02-08 00:38:01       82 阅读
  4. Python语言-面向对象

    2024-02-08 00:38:01       91 阅读

热门阅读

  1. Kylin系统下Qt的各种中文问题解决思路

    2024-02-08 00:38:01       61 阅读
  2. 1755. 最接近目标值的子序列和

    2024-02-08 00:38:01       54 阅读
  3. zstd字典压缩的大数据生产实践 & ctf逆向出题启发

    2024-02-08 00:38:01       49 阅读
  4. typedef 与#define 的概念及区别?

    2024-02-08 00:38:01       54 阅读
  5. 工具--Git详解

    2024-02-08 00:38:01       59 阅读
  6. MySQL数据库基础与SELECT语句使用梳理

    2024-02-08 00:38:01       41 阅读
  7. 查看 iOS 系统的日志或崩溃日志

    2024-02-08 00:38:01       55 阅读
  8. 如何使用 uniapp 开发(一)

    2024-02-08 00:38:01       54 阅读
  9. C++进阶--C++11包装器

    2024-02-08 00:38:01       55 阅读
  10. 【5G NR】移动通讯中使用的信道编解码技术

    2024-02-08 00:38:01       50 阅读
  11. Python 机器学习 特征预处理

    2024-02-08 00:38:01       51 阅读