Alien Order
来源:互联网 发布:json对象合并成一个 编辑:程序博客网 时间:2024/05/30 04:29
https://leetcode.com/problems/alien-dictionary/
单词按照一定次序排序,推导出原始顺序,典型的toposort,非常好的题目和重要的算法。
还是习惯炒肉说的基于indegree的bfs,学神的dfs总觉得别扭。当年老师教的静态链表太差了,太麻烦
有一个point就是里面不出现的单词不能出现,因此一定要mark,不然到时候都丢到queue里面取,因此可以用负数标记-1,因为度都是非负数,
然后图要去除环和重边,考虑到这点用hashmap edge[26]来存比较好
我写了两种写法,再生成图的时候,一种是从比较上下两个单词的第一次不同的单词来生成图,第二种是一个个枚举,然后每次还要取一个前缀串,似乎这个会多一个取串的系数,
第一种写法,还是这种好一些
class Solution {public: string alienOrder(vector<string>& dict) { unordered_set<int> edge[26]; int deg[26]; memset(deg, -1 ,sizeof deg); int maxlen=0; for(auto s: dict){ maxlen=max((int)s.size(), maxlen); for(auto se: s){ deg[se-'a']=0; } } int cnt=0;//get chars count from input for(int i=0;i<26;i++){ if(!deg[i]) cnt++; } for(int i=1;i<dict.size();i++){ for(int j=0; j < min(dict[i-1].size(), dict[i].size()); j++){ char from=dict[i-1][j], to=dict[i][j]; if(from != to){ if( !edge[from-'a'].count(to-'a')){ edge[from-'a'].insert(to-'a'); deg[to-'a']++; break; } } } } queue<int> q; for(int i=0;i<26;i++){ if(!deg[i]) q.push(i); } string ans; while(!q.empty()){ auto cur=q.front();q.pop(); ans.push_back(cur+'a'); for(auto e: edge[cur]){ if((--deg[e])==0) q.push(e); } } return ans.size()==cnt ? ans : ""; }} S;
第二种写法,只是生成图的部分差别较大
class Solution {public: string alienOrder(vector<string>& words) { unordered_set<char> umch; int maxlen=0; for(auto se: words){ maxlen=max(maxlen, (int)se.size()); for(auto e: se){ umch.insert(e); } } //mark in words and outof words char, as indegree 0 would be put in queue int indeg[26]; memset(indeg, -1, sizeof indeg); for(auto e: umch){ indeg[e-'a']=0; } int wordnum=words.size(); unordered_set<int> edge[26]; for(int i=0;i<maxlen;i++){ for(int j=0;j<wordnum;j++){ if(j-1>=0 && i<words[j].size() && i<words[j-1].size() && words[j][i] != words[j-1][i] && words[j-1].substr(0, i) == words[j].substr(0, i)){ int fromindex=words[j-1][i]-'a', toindex=words[j][i]-'a'; if( !edge[fromindex].count(toindex)){ edge[fromindex].insert(toindex); indeg[toindex]++; } } } } queue<int> q; for(int i=0;i<26;i++){ if(!indeg[i]) q.push(i); } string ans; while(!q.empty()){ auto cur=q.front();q.pop(); ans+=char('a'+cur); for(auto e: edge[cur]){ if(!(--indeg[e])) q.push(e); } } return ans.size() == umch.size() ? ans: ""; }} S;
0 0
- Alien Order
- GeeksforGeeks: Given a sorted dictionary of an alien language, find order of characters
- Alien Numbers
- Alien Numbers
- Alien Numbers
- Alien Numbers
- Alien Dictionary
- Alien Dictionary
- Alien Dictionary
- Alien Security
- order
- ORDER
- Order
- 外来物种 alien species
- [Code Jam] Alien Language
- POJ 1130 Alien Security
- poj 1130Alien Security
- A - Alien's Organ
- 关于内存中栈和堆的区别
- Unity3D有限状态机(FSM)学习笔记【2】IState
- 2015-08-30 一周总结报告
- C语言基础知识之(十三):指针、指针和数组
- 模拟淘宝侧边服务模块鼠标悬停效果的三种实现方式总结
- Alien Order
- Dataguard 重启方法
- CronSequenceGenerator
- 找数
- uImage,zimage,bzimage,vmlinux,vmlinuz
- Jetty JNDI开发实战(上)
- Python 列表学习与使用
- Ubuntu 10.04 速配指南
- C语言基础知识之(十四):指针和字符数组、字符串数组