【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容器类型之列表/字典/元组/集合方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录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

Oracle数据库(数据字典、表空间、表的创建、视图)

知识点引用: http://www.2cto.com/database/201207/142874.html http://blog.csdn.net/haiross/article/details/11772847 一. 彻底卸载Oracle 方式1、重装操作系统 方式2、 2.1 DBCA删除数据库开始 → 程序 → Oracle → 开发与移植工具 → Datab

Python的字符串,list,tuple,set,字典操作详解

1.字符串python是要创建成字符串的元素,其中的每个字母都是单一的子串,把它放在' '单引号或是'' ''引号中,就完成了python 字符串的创建。#str强制转换>>> a=123>>> b=str(a) #将整数转化为字符串>>> b'123'>>> a=[1,2,3]>>> b=str(a) #将list转化为字符串>>> b'[1, 2, 3]'#字符串下

OC中数组、字典、集合常用方法的运用

/* ====================== 一 NSArray========================          1.创建对象          1.1初始化方法(2) //一般程序有问题先检查初始化          1.2类方法          1.3字面量方法          2.数组查找          2.1通过下标访问对象[ .[i]]

python pickle 模块用于保存python内存数据(包括实例对象、字典、列表等所有python中的数据)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言基本用法 前言 Python 的 pickle 模块用于序列化和反序列化 Python 对象。这意味着你可以将 Python 对象(如列表、字典、类实例等)转换为字节流(序列化),并将其保存到文件中或在网络上传输,然后在需要的时候将其恢复为原始 Python 对象(反序列化)。 常见用途