日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode 269. 火星词典(拓扑排序)

發(fā)布時(shí)間:2024/7/5 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode 269. 火星词典(拓扑排序) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

    • 1. 題目
    • 2. 解題

1. 題目

現(xiàn)有一種使用字母的全新語(yǔ)言,這門語(yǔ)言的字母順序與英語(yǔ)順序不同。

假設(shè),您并不知道其中字母之間的先后順序。
但是,會(huì)收到詞典中獲得一個(gè) 不為空的 單詞列表。
因?yàn)槭菑脑~典中獲得的,所以該單詞列表內(nèi)的單詞已經(jīng) 按這門新語(yǔ)言的字母順序進(jìn)行了排序。

您需要根據(jù)這個(gè)輸入的列表,還原出此語(yǔ)言中已知的字母順序。

示例 1: 輸入: ["wrt","wrf","er","ett","rftt" ] 輸出: "wertf"示例 2: 輸入: ["z","x" ] 輸出: "zx"示例 3: 輸入: ["z","x","z" ] 輸出: "" 解釋: 此順序是非法的,因此返回 ""。提示: 你可以默認(rèn)輸入的全部都是小寫(xiě)字母 若給定的順序是不合法的,則返回空字符串即可 若存在多種可能的合法字母順序,請(qǐng)返回其中任意一種順序即可

來(lái)源:力扣(LeetCode) 鏈接:https://leetcode-cn.com/problems/alien-dictionary
著作權(quán)歸領(lǐng)扣網(wǎng)絡(luò)所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系官方授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。

2. 解題

參考:圖Graph–拓?fù)渑判?#xff08;Topological Sorting)

  • 建立第一個(gè)不相同的字符之間的有向圖的邊
  • 記錄節(jié)點(diǎn)的入度,把入度為0的點(diǎn)入隊(duì)BFS
class Solution { public:string alienOrder(vector<string>& words) {unordered_set<char> allchar;for(string& w : words){for(char ch : w)allchar.insert(ch);}//記下所有的字符unordered_map<char,int> indegree;unordered_map<char,unordered_set<char>> graph;int n1, n2, n;for(int i = 1, j; i < words.size(); ++i){ if(words[i-1] == words[i])continue;n1 = words[i-1].size();n2 = words[i].size();n = min(n1, n2);for(j = 0; j < n; ++j){if(words[i-1][j] != words[i][j]){ //不相等的第一個(gè)構(gòu)成有向圖的邊if(!graph.count(words[i-1][j]) || !graph[words[i-1][j]].count(words[i][j])){ //防止重復(fù)添加同一條邊 "za","zb","ca","cb"graph[words[i-1][j]].insert(words[i][j]);indegree[words[i][j]]++;indegree[words[i-1][j]] += 0;}break;}}if(j == n && n1 > n2)return "";//前面相等,前者長(zhǎng)不行}queue<char> q;for(auto it = indegree.begin(); it != indegree.end(); ++it){if(it->second == 0)//入度為0的入隊(duì)q.push(it->first);}string ans;while(!q.empty()){char ch = q.front();allchar.erase(ch);q.pop();ans += ch;for(auto it = graph[ch].begin(); it != graph[ch].end(); ++it){if(--indegree[*it] == 0)q.push(*it);}}if(ans.size() != indegree.size())return "";//有環(huán)while(allchar.size()){ //剩余字符隨便放ans += *allchar.begin();allchar.erase(allchar.begin());}return ans;} };

4 ms 7.2 MB


我的CSDN博客地址 https://michael.blog.csdn.net/

長(zhǎng)按或掃碼關(guān)注我的公眾號(hào)(Michael阿明),一起加油、一起學(xué)習(xí)進(jìn)步!

總結(jié)

以上是生活随笔為你收集整理的LeetCode 269. 火星词典(拓扑排序)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。