【LintCode】892.外星人字典

2024-01-18 04:12
文章标签 字典 外星人 lintcode 892

本文主要是介绍【LintCode】892.外星人字典,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目

描述

有一种新的使用拉丁字母的外来语言。但是,你不知道字母之间的顺序。你会从词典中收到一个 非空的 单词列表,其中的单词在这种新语言的规则下按字典顺序排序。请推导出这种语言的字母顺序。

注意:

  1. 你可以假设所有的字母都是小写。
  2. 如果字符串 a 是字符串 b 的前缀,且 b 出现在 a 之前,那么这个顺序是无效的。
  3. 如果顺序是无效的,则返回空字符串。
  4. 这里可能有多个有效的字母顺序,返回以正常字典顺序看来最小的。
  5. 一个字符串中的字母默认是同一等级的,且按照人类字典序排序。

样例

样例1

输入:["wrt","wrf","er","ett","rftt"]
输出:"wertf"
解释:
从 "wrt""wrf" ,我们可以得到 't'<'f'"wrt""er" ,我们可以得到'w'<'e'"er""ett" ,我们可以得到 get 'r'<'t'"ett""rftt" ,我们可以得到 'e'<'r'
所以返回 "wertf"

样例2:

输入:["z","x"]
输出:"zx"
解释:
从 "z""x",我们可以得到 'z' < 'x'
所以返回"zx"

原题链接

892.外星人字典

思路

先比较相邻的字符串,能生成一条边,如"bck" “bak”,根据顺序可生成一条 c 指向 a 的边,即c->a。

根据这些生成的边得到一个图,再对该图进行拓扑排序

更详细的分析见 Leetcode 269.火星词典

代码

class Solution {
public:/*** @param words: a list of words* @return: a string which is correct order*/string alienOrder(vector<string> &words) {if (words.size() == 0) return "";unordered_map<char, int> indegree; //入度表//如果a->b,则b的入度为1for (int i = 0; i < words.size(); i++) {for (char c : words[i]) {indegree[c] = 0; //初始时,所有字符的入度都为0}}//比如a->b,a->c,则key为a,value为{b, c}//记录字符的后继字符(邻居)unordered_map<char, unordered_set<char>> graph;for (int i = 0; i < words.size() - 1; i++) {//比较相邻字符串(当前字符串和下一个字符串),找边string cur = words[i];string next = words[i + 1];//需要比较的长度是两个字符串中较小的长度,重叠的部分才有可能产生边//如bck和bckf只需要比较3个字符长度即可,int len = min(cur.size(), next.size()); int j = 0;for (; j < len; j++) {if (cur[j] != next[j]) { //找到一条边如absfk和abcf,找到一条边s->cif (!graph[cur[j]].count(next[j])) { //同一条边不要重复加入度graph[cur[j]].insert(next[j]);indegree[next[j]]++; }break; //找到一条边就跳出当前循环}}if (j < cur.size() && j == next.size()) { //cur的长度 > next的长度,如bckf 和 bck,这种情况就无字典序return "";}}//拓扑排序string ans;priority_queue<char, vector<char>, greater<char>> que;for (auto it : indegree) {if (it.second == 0) { //所有入度为0的点先入队que.push(it.first);} }while (!que.empty()) {char cur = que.top();que.pop();ans += cur;if (graph.count(cur)) { for (char next : graph[cur]) { if (--indegree[next] == 0) { //cur的邻居的入度全部减1,再将邻居入度为0的入队que.push(next); }}}}//如"zy""zx",应该输出"yxz"//"ad","abc"应该输出"abcd"return ans.size() == indegree.size() ? ans : "";}
};

这篇关于【LintCode】892.外星人字典的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/618045

相关文章

Python实现字典转字符串的五种方法

《Python实现字典转字符串的五种方法》本文介绍了在Python中如何将字典数据结构转换为字符串格式的多种方法,首先可以通过内置的str()函数进行简单转换;其次利用ison.dumps()函数能够... 目录1、使用json模块的dumps方法:2、使用str方法:3、使用循环和字符串拼接:4、使用字符

Python 常用数据类型详解之字符串、列表、字典操作方法

《Python常用数据类型详解之字符串、列表、字典操作方法》在Python中,字符串、列表和字典是最常用的数据类型,它们在数据处理、程序设计和算法实现中扮演着重要角色,接下来通过本文给大家介绍这三种... 目录一、字符串(String)(一)创建字符串(二)字符串操作1. 字符串连接2. 字符串重复3. 字

Python 字典 (Dictionary)使用详解

《Python字典(Dictionary)使用详解》字典是python中最重要,最常用的数据结构之一,它提供了高效的键值对存储和查找能力,:本文主要介绍Python字典(Dictionary)... 目录字典1.基本特性2.创建字典3.访问元素4.修改字典5.删除元素6.字典遍历7.字典的高级特性默认字典

python3如何找到字典的下标index、获取list中指定元素的位置索引

《python3如何找到字典的下标index、获取list中指定元素的位置索引》:本文主要介绍python3如何找到字典的下标index、获取list中指定元素的位置索引问题,具有很好的参考价值,... 目录enumerate()找到字典的下标 index获取list中指定元素的位置索引总结enumerat

Python容器类型之列表/字典/元组/集合方式

《Python容器类型之列表/字典/元组/集合方式》:本文主要介绍Python容器类型之列表/字典/元组/集合方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 列表(List) - 有序可变序列1.1 基本特性1.2 核心操作1.3 应用场景2. 字典(D

python 字典d[k]中key不存在的解决方案

《python字典d[k]中key不存在的解决方案》本文主要介绍了在Python中处理字典键不存在时获取默认值的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录defaultdict:处理找不到的键的一个选择特殊方法__missing__有时候为了方便起见,

POJ2001字典树

给出n个单词,求出每个单词的非公共前缀,如果没有,则输出自己。 import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.io.UnsupportedEncodingException;

python 实现第k个字典排列算法

第k个字典排列算法介绍 "第k个字典排列"算法通常指的是在给定的字符集合(例如,字符串中的字符)中,找到所有可能排列的第k个排列。这个问题可以通过多种方法解决,但一个常见且高效的方法是使用“下一个排列”算法的变种,或称为“第k个排列”的直接算法。 方法一:使用“下一个排列”的变种 生成所有排列:首先生成所有排列,但显然这种方法对于较大的输入集合是不切实际的,因为它涉及到大量的计算和存储。 排序

POJ3617(字典序最小问题)

书中43页 此题有坑点,PE了40分钟.也是醉了....题目要求每80个字符才换行,而且最后一个如果恰好就不用换,这不是无聊嘛....... #include <iostream>#include <cstdio>#include <cstring>using namespace std;int n,m;char S[2100],P[2100];int main(){#ifd

POJ 2001 Shortest Prefixes(字典树入门)

题目: http://poj.org/problem?id=2001 题意: 找到多个字符串中,各自唯一的最短子串,例如 carte 与 carce 各自唯一的最短子串为cart与carc,即不会与其它字符串的子串重复。 思路: 字典树 解题心得: 更新关键值的时机很重要 代码: #include<stdio.h>#include<string>typedef str