算法刷题打卡第88天:字母板上的路径

news2024/9/23 13:24:18

字母板上的路径

难度:中等

我们从一块字母板上的位置 (0, 0) 出发,该坐标对应的字符为 board[0][0]

在本题里,字母板为board = ["abcde", "fghij", "klmno", "pqrst", "uvwxy", "z"],如下所示。

请添加图片描述
我们可以按下面的指令规则行动:

  • 如果方格存在,'U' 意味着将我们的位置上移一行;
  • 如果方格存在,'D' 意味着将我们的位置下移一行;
  • 如果方格存在,'L' 意味着将我们的位置左移一列;
  • 如果方格存在,'R' 意味着将我们的位置右移一列;
  • '!' 会把在我们当前位置 (r, c) 的字符 board[r][c] 添加到答案中。
    (注意,字母板上只存在有字母的位置。)

返回指令序列,用最小的行动次数让答案和目标 target 相同。你可以返回任何达成目标的路径。

示例 1:

输入:target = "leet"
输出:"DDR!UURRR!!DDD!"

示例 2:

输入:target = "code"
输出:"RR!DDRR!UUL!R!"

哈希表

思路:

  • 根据字符输入,可以计算出对应的位置
  • 根据位置左右和上下移动即可
  • 需注意,移动到z只能先左右再上下,从z移动出去只能先上下再左右

复杂度分析:

  • 时间复杂度: O ( n ) O(n) O(n) n n n t a r g e t target target 长度
  • 空间复杂度: O ( c ) O(c) O(c) c c c 26 26 26
class Solution:
    def alphabetBoardPath(self, target: str) -> str:
        word_dicts = dict()
        board = ["abcde", "fghij", "klmno", "pqrst", "uvwxy", "z"]
        for x, i in enumerate(board):
            for y, j in enumerate(i):
                word_dicts[j] = [x, y]
        now_position = [0, 0]
        res = ""
        
        def lr_move(target_position, now_position, res):
            if target_position[1] - now_position[1] >= 0:
                res += 'R' * abs(target_position[1] - now_position[1])
            else:
                res += 'L' * abs(target_position[1] - now_position[1])
            return res
        def ud_move(target_position, now_position, res):
            if target_position[0] - now_position[0] >= 0:
                res += 'D' * abs(target_position[0] - now_position[0])
            else:
                res += 'U' * abs(target_position[0] - now_position[0])
            return res
            
        for i in target:
            target_position = word_dicts[i]
            if i != 'z':
                res = ud_move(target_position, now_position, res)
                res = lr_move(target_position, now_position, res)
            else:              
                res = lr_move(target_position, now_position, res)
                res = ud_move(target_position, now_position, res)
            res += "!"
            now_position = target_position
        return res

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/alphabet-board-path

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

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

相关文章

【Java|golang】1138. 字母板上的路径

我们从一块字母板上的位置 (0, 0) 出发,该坐标对应的字符为 board[0][0]。 在本题里,字母板为board [“abcde”, “fghij”, “klmno”, “pqrst”, “uvwxy”, “z”],如下所示。 我们可以按下面的指令规则行动: 如果方格存…

【计组】理解Disruptor--《计算机组成原理》(十五)

Disruptor 的开发语言,并不是很多人心目中最容易做到性能极限的 C/C,而是性能受限于 JVM 的 Java。其实只要通晓硬件层面的原理,即使是像 Java 这样的高级语言,也能够把 CPU 的性能发挥到极限。 一、Padding Cache Line&#xff…

mysql中mvcc实现机制和原理

目录 1.什么是mvcc? 2.mvcc中的快照读和当前读有什么区别和联系? 3.mvcc的作用是什么? 4.mvcc的实现机制和原理是什么? 1.什么是mvcc? mvcc全称是(Multi-Version Concurrency Control) 多版本并发控制,是数据库管理过程中的一种并发控制…

keras+IMDB情感分析

目录简介IDMB数据集数据预处理数据加载数据清洗保存经过清洗后的数据训练测试数据集分割文字编码词嵌入模型构建模型训练训练效果模型评分模型预测及混淆矩阵查看F1 Score、召回率等信息预测新的影评总结本博客参考: 【python自然语言处理 周元哲著】 【keras中文文…

数据库索引篇(二叉树/B-Tree)对比结构讲解

我们可以先看一下 二叉树的一个结构 简单将数据分成左右两侧 左侧小于36 右侧大于36 在下面再以这种方式继续划分 但二叉树的结构就有一个非常大的弊端 如果我们后续插入的数据全部小于 或 大于36 他就会 变成这样 一个链表 查询效率大大降低 因为 比如 你想找什么数据 都会…

岁月闲思——时间给我地思考

岁月闲思——时间给我地思考 2022年6月10日,明天又一个周末,成人地时间总是让人感觉一天很慢,一周以及一年反而很快。 下班到家,吃过长辈做的手工凉皮,得空坐在电脑面前敲击点文字,记录下时间留给自己地印…

Docker--consul

目录 前言 一、Consul 简介 1.1、 consul 概述 1.2 、consul 的两种模式 1.3、consul 提供的一些关键特性 二、Consul 容器服务更新与发现 三、consul 部署 3.2、查看集群信息 四、registrator服务器 consul-template 五、consul 多节点 前言 服务注册与发现是微服…

软件测试面试十大必考题目(通用)

目录 (1) 为什么想进本公司? (2) 喜欢这份工作的哪一点? (3) 自己的优缺点为何? (4) 对公司的了解有多少? (5&#xf…

C++创建多线程的方法总结

下个迭代有个任务很有趣,用大量的线程去访问一个接口,直至其崩溃为止,这就需要多线程的知识,这也不是什么难事,总结一下C中的多线程方法:std、boost、pthread、windows api。 目录 一、多线程预备知识 二…

图解浏览器渲染页面详细过程

渲染详细过程 产生渲染任务,开启渲染流程 当浏览器的网络线程收到 HTML 文档后,会产生一个渲染任务,并将其传递给渲染主线程的消息队列。 在事件循环机制的作用下,渲染主线程取出消息队列中的渲染任务,开启渲染流程。…

IDEA 常用快捷键回顾

一 Alt 数字键 1. Alt 1: 打开项目 2. Alt 2: 打开Favorites 3. Alt 3: 打开Find 4. Alt 4: 打开Run 5. Alt 5: 打开Debug 6. Alt 6: 打开当前所在文件 7. Alt 7: 打开Structure 8. Alt 8: 打开Services 9. Alt 9: 打开Git日志 二 Ctrl 其他键 1. Ctrl…

【Flink】详解JobGraph

概述 JobGraph 是 StreamGraph 优化后的产物,客户端会将优化后的 JobGraph 发送给 JM。接下来的文章涉及到一些前置知识点,没有看前几期的小伙伴最好看一下前几期: 【Flink】详解StreamGraph【Flink】浅谈Flink架构和调度【Flink】详解Flin…

【Flutter入门到进阶】Dart进阶篇---进阶用法

1 Dart对象扩展 1.1 extension 1.1.1 介绍 可以在不更改类或创建子类的情况下,向类添加扩展功能的一种方式。灵活使用 extension 对基础类进行扩展,对开发效率有显著提升。 1.1.2 需求 在开发项目中碰到需求:将单位为分的数值转换成单位为…

RabbitMQ(黑马spring cloud笔记)

MQ 目录MQ一、同步通讯和异步通讯1. 同步通讯2. 异步通讯二、RabbitMQ1. 部署2. 架构3. 常见消息模型3.1 基本消息队列(Basic Queue)3.2 工作消息队列(Work Queue)3.3 发布订阅(Publish、Subscribe)4. 消息…

TPAMI 2022 | RC-Explainer:图神经网络的强化因果解释器

文章目录 一、论文关键信息二、基础概念三、主要内容1. Motivations2. Insights3. 解决方案的关键四、总结与讨论CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 一、论文关键信息 论文标题:Reinforced Causal Explainer for Graph Neural Networks 期刊信息:IEEE Transact…

【C++】内存管理

🍅不同的数据放在不同的地方,需要内存管理 目录 ☃️1.C/C中的内存分布 ☃️2.C语言中动态内存管理方式 ☃️3.C内存管理方式 🐝3.1 new/delete操作内置类型 🐝3.2 new和delete操作自定义类型 🐝3.3 operator n…

FISCO BCOS节点扩容和使用console进行群组扩容

一、安装并启动FISCO BCOS 搭建单机单群组4节点的教程查看:https://blog.csdn.net/yueyue763184/article/details/128924144?spm1001.2014.3001.5501 二、下载扩容脚本 在fisco目录下输入以下命令: curl -#LO https://raw.githubusercontent.com/FI…

155、【动态规划】leetcode ——474. 一和零:三维数组+二维滚动数组(C++版本)

题目描述 原题链接:474. 一和零 解题思路 (1)三维数组 本题是要在已有的字符串中,找到给定的m个0和n个1,组出最大的子集。将字符串集合中的各个字符串看作物品,m个0和n个1看作背包的重量,则该…

jenkins +docker+python接口自动化之jenkins容器安装python3(二)

jenkins dockerpython接口自动化之jenkins容器安装python3(二) 目录:导读 前提是在docker下已经配置好jenkins容器了,是将python安装在jenkins容器下的 1、先看你的jenkins是否安装好 2、以root权限进入jenkins容器&#xff1…

NLP方向的论文可投的核心期刊

目录1、《计算机仿真》北大核心、科技核心2、《通信学报》北大核心、科技核心、CSCD核心3、《计算机科学》北大核心、EI来源期刊、CSCD核心4、《计算机工程》北大核心、科技核心5、《计算机应用》北大核心、科技核心、CSCD核心6、《计算机工程与应用》北大核心、科技核心、CSCD…