[Locked] Alien Dictionary
Alien Dictionary
There is a new alien language which uses the latin alphabet. However, the order among letters are unknown to you. You receive a list of words from the dictionary, where words are sorted lexicographically by the rules of this new language. Derive the order of letters in this language.
For example, Given the following words in dictionary,
[
"wrt",
"wrf",
"er",
"ett",
"rftt"
]
The correct order is: "wertf".
Note: You may assume all letters are in lowercase. If the order is invalid, return an empty string. There may be multiple valid order of letters, return any one of them is fine.
分析:
前后关系可看做是一种偏序关系,对于每个序列,可以看成是有向图,所有序列合在一起就成了一个大的有向图,本题可转换成有向图的拓扑排序,用BFS可解决。主要过程包含:1、根据string数组的信息映射成图;2、在图上计算出所有节点的入度;3、进行BFS,得到拓扑排序结果。故我用三个子函数来分别处理这三个过程。
代码:
//将string数组映射到图上,最坏时间复杂度就是每个字母遍历一遍,这也是必要,故也是最低时间复杂度
unordered_multimap<char, char> mapping(vector<string> &vs) {
//先处理第一列,用validcomp来记录哪些相邻行的值相等,用于后面的列的处理,不相等的就可以得偏序条件,用边来表示,存入edges中;然后处理第二列,以此类推。
unordered_multimap<char, char> edges;
unordered_set<int> validcomp, temp;
for(int i = ; i < vs.size(); i++)
validcomp.insert(i);
int j = ;
while(!validcomp.empty()) {
for(int pos : validcomp) {
if(vs[pos][j] != vs[pos - ][j])
edges.insert(make_pair(vs[pos - ][j], vs[pos][j]));
else
temp.insert(pos);
}
unordered_set<int> ().swap(validcomp);
validcomp.swap(temp);
j++;
}
return edges;
} //返回所有节点的入度,存入degree里
unordered_map<char, int> getDegree(unordered_multimap<char, char> &edges) {
unordered_map<char, int> degree;
for(char c = 'a'; c <= 'z'; c++) {
auto range = edges.equal_range(c);
auto pos = range.first;
while(pos != range.second) {
//指出节点未出现过,则设0,否则跳过;指入节点未出现过,则设1,否则++。
if(degree.find(pos->first) == degree.end())
degree[pos->first] = ;
if(degree.find(pos->second) != degree.end())
degree[pos->second]++;
else
degree[pos->second] = ;
pos++;
}
}
return degree;
} //进行BFS,用最朴素的方法,复杂度为O(N^2),用这个方法找到符合题目要求的顺序,如果能遍历完全所有节点,则return这个顺序;否则,return ""
bool bfs(string &str, unordered_map<char, int> degree, unordered_multimap<char, char> &edges) {
bool visited[];
memset(visited, , );
for(int i = ; i < degree.size(); i++) {
for(auto m : degree)
//入度为0则排入,然后更新入度hash表
if(!visited[int(m.first - 'a')] && m.second == ) {
visited[int(m.first - 'a')] = true;
str += m.first;
auto range = edges.equal_range(m.first);
auto pos = range.first;
while(pos != range.second) {
degree[pos->second]--;
pos++;
}
break;
}
}
//有环,则return ""
for(auto m : degree)
if(m.second != )
return false;
return true;
}
//主函数
string validOrder(vector<string> vs) {
//string数组映射到图edges上
unordered_multimap<char, char> edges = mapping(vs);
//返回所有节点的入度,存入degree;如果无效,则return "";
unordered_map<char, int> degree = getDegree(edges);
//进行BFS,找到合适的顺序,优先排入入度为0的点
string str = "";
bool valid = bfs(str, degree, edges);
return valid ? str : "";
}
其中,BFS过程,即函数bfs复杂度为O(N^2),N为节点个数,有改进的空间;可以优化为O(E),E为边的个数
//优化BFS
bool bfs(string &str, unordered_map<char, int> degree, unordered_multimap<char, char> &edges) {
queue<char> myq, temp;
for(auto m : degree)
if(m.second == )
myq.push(m.first);
while(!myq.empty()) {
while(!myq.empty()) {
char c = myq.front();
str += c;
myq.pop();
auto range = edges.equal_range(c);
auto pos = range.first;
while(pos != range.second) {
degree[pos->second]--;
if(degree[pos->second] == )
temp.push(pos->second);
pos++;
}
}
queue<char> ().swap(myq);
myq.swap(temp);
}
//有环,则return ""
for(auto m : degree)
if(m.second != )
return false;
return true;
}
[Locked] Alien Dictionary的更多相关文章
- 【Leetcode_easy】953. Verifying an Alien Dictionary
problem 953. Verifying an Alien Dictionary solution: class Solution { public: bool isAlienSorted(vec ...
- Verifying an Alien Dictionary
2019-11-24 22:11:30 953. Verifying an Alien Dictionary 问题描述: 问题求解: 这种问题有一种解法是建立新的排序和abc排序的映射,将这里的str ...
- [LeetCode] Alien Dictionary 另类字典
There is a new alien language which uses the latin alphabet. However, the order among letters are un ...
- 269. Alien Dictionary 另类字典 *HARD*
There is a new alien language which uses the latin alphabet. However, the order among letters are un ...
- Alien Dictionary
There is a new alien language which uses the latin alphabet. However, the order among letters are un ...
- LeetCode Alien Dictionary
原题链接在这里:https://leetcode.com/problems/alien-dictionary/ 题目: There is a new alien language which uses ...
- Leetcode: Alien Dictionary && Summary: Topological Sort
There is a new alien language which uses the latin alphabet. However, the order among letters are un ...
- 269. Alien Dictionary
题目: There is a new alien language which uses the latin alphabet. However, the order among letters ar ...
- [Swift]LeetCode269. 外星人词典 $ Alien Dictionary
There is a new alien language which uses the latin alphabet. However, the order among letters are un ...
随机推荐
- C# 面向对象编程的继承性-多继承
多继承 如果要使用多继承,需要使用接口,因为C#中的类只支持单继承,而接口支持多继承,实现多继承时,继承的多个接口中间用逗号(,)隔开. 说明: 实现多继承时,继承的可以是多个接口,也可以是一个类及多 ...
- 可以打开mdb文件的小软件
下载地址: http://dl-sh-ocn-1.pchome.net/09/rh/DatabaseBrowser.zip
- 设置css三种方法的优先级
有的小伙伴问了,如果有一种情况:对于同一个元素我们同时用了三种方法设置css样式,那么哪种方法真正有效呢?在下面代码中就出现了这种情况 1.使用内联式CSS设置“超酷的互联网”文字为粉色. 2.然后使 ...
- SGU 167.I-country
时间限制:0.75s 空间限制:65M 题意: 在一个n*m(n,m<=15)的网格中,每个格子有一个值,现在从网格中取出k(k<=n*m)个,保证在选中的格子中从任意一个格子去另外的所有 ...
- SGU 168.Matrix
时间限制:0.5s 空间限制:15M 题意: 给出一个N*M的矩阵A,计算矩阵B,满足B[i][j]=min{ A[x][y]:(y>=j) and ( x>=i+j-y )} Solut ...
- 【HDU4366】【DFS序+分块】Successor
Problem Description Sean owns a company and he is the BOSS.The other Staff has one Superior.every st ...
- JqGrid自定义toolbar
1.设置toolbar参数为[true,"top"],其意思是toolbar显示在Grid顶部,且其id为t_+Grid的id.e.g.: Grid的id为myGrid,toolb ...
- C#中foreach遍历学习笔记
using System; using System.Collections; using System.Collections.Generic; using System.Linq; using S ...
- 微信小程序,大多数人误解的8个问题
作者:王安,数字天堂DCloud公司创始人兼CEO 注:本文内容包含技术.商业,不懂技术的读者可以只看商业相关的内容.本文仅代表作者一家之言,如有不同意见,欢迎留言讨论~ 8个误解 坊间所传的信息很多 ...
- windows系统安装ubuntu后,grub中没有windows启动项
我的问题: 安装系统时候,选择grub安装在sdb磁盘 http://forum.ubuntu.org.cn/viewtopic.php?f=139&t=474289&start=15 ...