当前位置: 首页 > news >正文

[算法题]火星词典

题目链接:火星词典

用拓扑排序求解:

1. 用 unordered_map<char, unordered_map<char, bool>> 保存字母的顺序关系,key 表示某个字母,val 表示排在 key 之后的字母的集合,已经记录出现过置为 true

2. 用 unordered_map<char, int> 保存入度,需要初始化,将出现过的字母设置 val 为 0

3. 需要固定一个字符串与其后每个字符串做比较,两个比较的字符串同时从下标 0 开始比较每个字母,不相同时则为 a -> b,b的入度++,更新后 break,循环到遍历结束

4. 定义一个队列,将入度为 0 的字母入队

5. 做一次 bfs

6. 判断是否有环并依此输出相应结果

题解代码:

class Solution 
{
public:string alienOrder(vector<string>& words) {string res; //保存结果unordered_map<char, unordered_map<char, bool>> edges; //保存点与点的连接关系unordered_map<char, int> in; //保存入度//初始化入度for(const auto& s : words){for(const auto& c : s){if(!in.count(c)){in[c] = 0;}}}for(int i = 0; i < words.size() - 1; ++i){for(int j = i + 1; j < words.size(); ++j){for(int k = 0; k < words[i].size(); ++k){//遇到"abc"-"ab"这种对比情况,直接返回""if(k == words[j].size()){return "";}//建立点与点的顺序关系if (words[i][k] != words[j][k]){//如果已经建立过关系则无需重复建立if (!edges[words[i][k]][words[j][k]]){edges[words[i][k]][words[j][k]] = true;in[words[j][k]]++; //更新入度}break;}}}}queue<char> q;//将入度为0的点添加到队列for(const auto& [k, v] : in){if(!v){q.push(k);}}//bfswhile(!q.empty()){char ch = q.front();q.pop();res += ch;for(const auto& [k, _] : edges[ch]){if(--in[k] == 0){q.push(k);}}}//判断是否存在环for(const auto& [_, v] : in){if(v){return "";}}return res;}
};

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Mysql-窗口函数二
  • 图的拓扑排序
  • RabbitMQ如何保证可靠性
  • 文档控件DevExpress Office File API v24.1 - 支持基于Unix系统的打印
  • 正则表达式扩展应用
  • Linux/C 高级——shell脚本
  • elasticsearch教程
  • 学习记录——day28 信号量集
  • 未来展望:PLC远程控制网关与工业物联网融合的发展趋势
  • 【Linux】系列入门摘抄笔记-4-查看文件内容命令cat/more/less/tail
  • web基础与http协议与配置
  • 美的神机后续
  • 【Datawhale AI夏令营第四期】 Datawhale AI夏令营第四期 魔搭-AIGC方向 Task01笔记
  • Android 文件上传与下载
  • 引导过程与服务控制
  • “大数据应用场景”之隔壁老王(连载四)
  • Android 架构优化~MVP 架构改造
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • PHP面试之三:MySQL数据库
  • React as a UI Runtime(五、列表)
  • Redux系列x:源码分析
  • 阿里云Kubernetes容器服务上体验Knative
  • 从零搭建Koa2 Server
  • 二维平面内的碰撞检测【一】
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 缓存与缓冲
  • 前端自动化解决方案
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • 为什么要用IPython/Jupyter?
  • 优秀架构师必须掌握的架构思维
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • ​io --- 处理流的核心工具​
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • #pragma 指令
  • (12)Hive调优——count distinct去重优化
  • (160)时序收敛--->(10)时序收敛十
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (2024)docker-compose实战 (9)部署多项目环境(LAMP+react+vue+redis+mysql+nginx)
  • (C#)获取字符编码的类
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (剑指Offer)面试题34:丑数
  • (原创)可支持最大高度的NestedScrollView
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • . NET自动找可写目录
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .NET 设计模式初探
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .NET4.0并行计算技术基础(1)
  • .NET多线程执行函数
  • .Net中的设计模式——Factory Method模式
  • /proc/stat文件详解(翻译)
  • @Bean有哪些属性
  • @entity 不限字节长度的类型_一文读懂Redis常见对象类型的底层数据结构