Leetcode 268 火星词典

题目描述:
现有一种使用英语字母的火星语言,这门语言的字母顺序与英语顺序不同。

给你一个字符串列表 words ,作为这门语言的词典,words 中的字符串已经 按这门新语言的字母顺序进行了排序 。

请你根据该词典还原出此语言中已知的字母顺序,并 按字母递增顺序 排列。若不存在合法字母顺序,返回 "" 。若存在多种可能的合法字母顺序,返回其中 任意一种 顺序即可。

字符串 s 字典顺序小于 字符串 t 有两种情况:

在第一个不同字母处,如果 s 中的字母在这门外星语言的字母顺序中位于 t 中字母之前,那么 s 的字典顺序小于 t 。
如果前面 min(s.length, t.length) 字母都相同,那么 s.length < t.length 时,s 的字典顺序也小于 t 。

示例:

示例 1:

输入:words = ["wrt","wrf","er","ett","rftt"]
输出:"wertf"

示例 2:

输入:words = ["z","x"]
输出:"zx"

示例 3:

输入:words = ["z","x","z"]
输出:""
解释:不存在合法字母顺序,因此返回 "" 。

提示:

1 <= words.length <= 100
1 <= words[i].length <= 100
words[i] 仅由小写英文字母组成

class Solution 
{
public:string alienOrder(vector<string>& words) {map<char, unordered_set<char>> m;int n = words.size(), count = 0;vector<int> degree(26, -1);string result = "";for (int i = 0; i < n - 1; i++) 
//遍历给定的单词列表,比较相邻单词的对应字符,如果字符不同,则在映射m中插入该字符及其后续字符{for (int j = 0; j < min(words[i].size(), words[i + 1].size()); j++) {if (words[i][j] != words[i + 1][j]) {m[words[i][j]].insert(words[i + 1][j]);break;} else if (j == min(words[i].size(), words[i + 1].size()) - 1 and words[i].size() > words[i + 1].size()) return result;
//如果相邻单词的长度不同,且较长的单词先出现,则直接返回空字符串。}}for (const auto& word : words) for (const auto& c : word) degree[c - 'a'] = 0;//遍历给定的单词列表,将每个字符的度数设置为0。for (const auto& [key, value] : m) for (const auto& v : m[key]) ++degree[v - 'a'];
//根据映射m,将每个字符的度数设置为其实际度数。queue<char> q; //创建一个队列q,用于存储度数为0的字符。
//遍历26个字符,将度数为0的字符添加到队列q中。for (int i = 0; i < 26; i++) {if (!degree[i]) q.push((char)(i + 'a'));if (degree[i] != -1) ++count;}
//创建一个空字符串result,用于存储最终的排序顺序。
//当队列q不为空时,执行以下操作: a. 从队列q中取出一个字符u。 b. 将字符u添加到结果字符串result中。 c. 如果映射m中包含字符u,则遍历其后续字符v,将度数减1,如果度数变为0,则将字符v添加到队列q中。while (!q.empty()) {auto u = q.front();q.pop();result += u;if (m.count(u)) {for (const auto& v : m[u]) {--degree[v - 'a'];if (!degree[v - 'a']) q.push(v);}}}
//如果结果字符串result的长度等于count,则返回result,否则返回空字符串。return result.size() == count ? result : "";}
};

分析——————————————————————————————————

1.初始化一个映射 m 来记录每个字符可以转换成哪个字符,初始化为空集合。
2.初始化一个数组 degree 来记录每个字符的入度(即有多少字符可以转换到它),初始化为 -1。
3.初始化一个空字符串 result 来记录最终的顺序。
4.遍历 words 列表,比较每对相邻字符串。
1)如果相邻字符串在相同位置上的字符不同,那么记录它们之间的转换关系,即将 words[i][j] 转换为 words[i + 1][j],并将其添加到 m[words[i][j]] 集合中。
2)如果相邻字符串在相同位置上的字符相同,且已经比较到字符串末尾,并且第一个字符串比第二个字符串长,那么直接返回空字符串,因为没有有效的顺序可以满足这些条件。
5.再次遍历 words 列表,初始化 degree 数组,记录每个字符的入度。
6.再次遍历 m 映射,更新 degree 数组,记录每个字符的入度。
7.初始化一个队列 q,并将所有入度为 0 的字符加入队列。
8.当队列不为空时,执行以下操作:
9.从队列中取出一个字符(入度为 0 的字符)。
10.将该字符添加到 result 字符串中。
1)如果该字符在 m 映射中有孩子节点,那么遍历这些孩子节点:减少它们对应的 degree 值。
2)如果减少后 degree 值为 0,那么将它们加入队列。
11.最后,如果 result 字符串的长度等于字符总数(即 count),则返回 result;否则返回空字符串,表示没有有效的顺序。
这个算法的时间复杂度是 O(NK^2),其中 N 是单词列表的长度,K 是单词的平均长度。这是因为我们需要遍历每个单词的所有字符,并且对于每个字符,我们可能需要遍历它的所有孩子节点。在最坏的情况下,这可能会有 O(NK^2) 次操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/728681.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

<网络安全>《65 微课堂<第6课 网间文件安全交换系统>》

1 5中文件传输方式 1.1 通过U盘、硬盘、光盘等硬件介质传输 优势是成本低。 劣势是1、无法对这个行为过程进行监控管理。2、大文件较大、高频率交换时需要专人负责。3、由于这个过程并没有杀毒、内容检测等环节&#xff0c;因此具有较大的安全风险。 1.2 FTP、SFTP等跨网传输…

WordPress建站入门教程:如何上传安装WordPress主题?

我们成功搭建WordPress网站后&#xff0c;默认使用的是自带的最新主题&#xff0c;但是这个是国外主题&#xff0c;可能会引用一些国外的资源文件&#xff0c;所以为了让我们的WordPress网站访问速度更快&#xff0c;强烈建议大家使用国产优秀的WordPress主题。 今天boke112百…

【C语言】球球大作战

前言&#xff1a; 这款简易版的球球大作战是一款单人游戏&#xff0c;玩家需要控制一个小球在地图上移动&#xff0c;吞噬其他小球来增大自己的体积。本游戏使用C语言和easyx图形库编写&#xff0c;旨在帮助初学者了解游戏开发的基本概念和技巧。 在开始编写代码之前&#xf…

Flutter中TextFormField的属性及使用详解

在Flutter中&#xff0c;TextFormField是一个常用的组件&#xff0c;用于接收用户的文本输入。它具有丰富的属性&#xff0c;可以用于实现各种输入框的需求。在本篇博客中&#xff0c;我们将详细介绍TextFormField的属性以及如何使用它来创建文本输入框。 1. 属性介绍 下面是…

js 操作JSON对象查找、删除、增加和修改

对JSON的查找 格式1&#xff1a; datas.key 格式2&#xff1a; datas[key] 示例&#xff1a; var obj {name: "张三", age: 18, gender: "男"}; console.log(obj.name); // 格式1&#xff1a;输出 张三 console.log(obj[name]); // 格式2&#xff1a;输…

【MySQL 系列】MySQL 架构篇

在我们开始了解 MySQL 核心功能之前&#xff0c;首先我们需要站在一个全局的视角&#xff0c;来看 SQL 是如何运作执行的。通过这种方式&#xff0c;我们可以在头脑中构建出一幅 MySQL 各组件之间的协同工作方式&#xff0c;有助于我们加深对 MySQL 服务器的理解。 文章目录 1、…

【洛谷 P8707】[蓝桥杯 2020 省 AB1] 走方格 题解(动态规划)

[蓝桥杯 2020 省 AB1] 走方格 题目描述 在平面上有一些二维的点阵。 这些点的编号就像二维数组的编号一样&#xff0c;从上到下依次为第 1 1 1 至第 n n n 行&#xff0c;从左到右依次为第 1 1 1 至第 m m m 列&#xff0c;每一个点可以用行号和列号来表示。 现在有个人…

深入浅出运维可观测工具(四):如何使用eBPF绘制网络拓扑图

哈喽~又到了我们技术分享环节了。eBPF这个系列自分享以来收到了很多朋友的喜欢&#xff0c;真是让博主又惊又喜&#xff0c;感谢大家的支持。话不多说&#xff0c;今天我们将对如何使用eBPF绘制网络拓扑图做一篇分享&#xff0c;文章较长&#xff0c;干货较多&#xff0c;大家可…

R语言lavaan结构方程模型在复杂网络分析中的科研技术新趋势

此外&#xff0c;我们还将深入探讨R语言的基础知识、结构方程模型的基本原理、lavaan程序包的使用方法等内容。无论是潜变量分析、复合变量分析&#xff0c;还是非线性/非正态/缺失数据处理、分类变量分析、分组数据处理等复杂问题&#xff0c;我们都将一一为您解析。 希望通过…

微服务获取登录用户Id与单体服务下获取用户Id对比(黑马头条Day03)

前置声明 当前前后端分离开发项目中&#xff0c;后端某个请求向具体某个数据库中的多个表插入数据时&#xff0c;经常需要使用到当前登录用户的Id&#xff08;唯一标识&#xff09;。在当前用户线程下以实现变量共享&#xff0c;同时为了避免不同用户线程之间操作变量的影响&am…

【机器学习300问】28、什么是决策树?

〇、两个预测任务 &#xff08;1&#xff09;任务一&#xff1a;银行预测偿还能力 当前&#xff0c;某银行正致力于发掘潜在的放贷用户。他们掌握了每位用户的三个关键特征&#xff1a;房产状况、婚姻状况以及年收入。此外&#xff0c;银行还拥有过往这些用户的债务偿还能力的…

蓝桥杯简单题,公司名称

题目链接&#xff08;需要登录&#xff09; #include <iostream> #include <cstring> #include <algorithm> using namespace std; bool lanqiao(string str,int len){ sort(str.begin(),str.end());//对str按照ascii排序if(str.find("Laainoq")s…

题目 1825: 蓝桥杯-穿越雷区

题目描述: X星的坦克战车很奇怪&#xff0c;它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转&#xff0c;否则将报废。 某坦克需要从A区到B区去&#xff08;A&#xff0c;B区本身是安全区&#xff0c;没有正能量或负能量特征&#xff09;&#xff0c;怎样走才能路…

安卓Java面试题11-20

🔥 11、Android本身的API并未声明会抛出异常,则其在运行时有无可能抛出runtime异常,如何解决?🔥 会,比如nullpointerException。我遇到过,比如textview.setText()时,textview没有初始化。会导致程序无法正常运行出现forceclose。打开控制台查看logcat信息找出异常信…

React 从0到1构建企业级框架基于Antd Designer

一、 create-react-app 创建 cms-front 二、 删除不必须要的文件形成如下结构 1. React版本为17版本 public 文件夹下保留 favicon.ico 偏爱图标index.html资源文件 2.src 保留 index.js 入口文件和app.js(基于spa原则)单文件即可 三、配置eslint 1. 安装 eslint. npm inst…

DataX及使用

DataX及使用 【一】DataX概述【二】DataX架构原理【1】设计理念【2】框架设计【3】运行流程【4】调度决策思路【5】DataX和Sqoop对比 【三】DataX部署【四】DataX上手【1】使用概述【2】配置文件格式【3】同步Mysql数据到HDFS 【五】DataX整合Springboot 【一】DataX概述 Data…

27.基于springboot + vue实现的前后端分离-网上租赁交易系统(项目 + 论文)

项目介绍 本课题是根据用户的需要以及网络的优势建立的一个基于Spring Boot的网上租贸系统&#xff0c;来满足用户网络商品租赁的需求。本网上租贸系统应用Java技术&#xff0c;MYSQL数据库存储数据&#xff0c;基于Spring Boot框架开发。在网站的整个开发过程中&#xff0c;首…

24 Linux PWM 驱动

一、PWM 驱动简介 其实在 stm32 中我们就学过了 PWM&#xff0c;这里就是再复习一下。PWM&#xff08;Pulse Width Modulation&#xff09;&#xff0c;称为脉宽调制&#xff0c;PWM 信号图如下&#xff1a; PWM 最关键的两个参数&#xff1a;频率和占空比。 频率是指单位时间内…

【数据结构】一、数据结构的基本概念

基本概念 数据是信息的载体&#xff0c;是描述客观事物属性的数、字符及所有能输入到计算机中并被计算机程序识别和处理的符号的集合。 数据是计算机程序加工的原料。 数据元素是数据的基本单位。通常作为一个整体进行考虑和处理&#xff0c;用一个数据元素描述一个个体。一…

idea拉取代码报错

idea拉取代码报错下面错误 Update failed WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! It is also possible that a host k…