leetcode 1807. 替换字符串中的括号内容【python3双指针+哈希表】实现过程分析以及思路整理

news2024/11/18 22:34:30

题目

给你一个字符串s,它包含一些括号对,每个括号中包含一个非空的键。

  • 比方说,字符串"(name)is(age)yearsold"中,有两个括号对,分别包含键"name"和"age"。
    你知道许多键对应的值,这些关系由二维字符串数组knowledge表示,其中knowledge[i] = [keyi, valuei],表示键keyi对应的值为valuei。你需要替换所有的括号对。当你替换一个括号对,且它包含的键
    为 keyi 时,你需要:
  • 将keyi和括号用对应的值valuei替换。
  • 如果从knowledge中无法得知某个键对应的值,你需要将keyi和括号用问号"?"替换(不需要引号)。knowledge中每个键最多只会出现一次。s中不会有嵌套的括号。
    请你返回替换所有括号对后的结果字符串。

示例

  • 输入:s = “(name)is(age)yearsold”, knowledge = [[“name”,“bob”],[“age”,“two”]]
  • 输出:“bobistwoyearsold”
  • 解释:键 “name” 对应的值为 “bob” ,所以将 “(name)” 替换为 “bob” 。键 “age” 对应的值为 “two” ,所以将 “(age)” 替换为 “two” 。

题解

感觉leetcode的题解稍显复杂,简单的问题描述的比较不容易理解。这个题目其实很简单,就是给定一个字符串,找出()里的单词,其实knowledge可以理解为一个替换字典[{key,value}],如果()里的单词在这个字典里,用字典的value替换这个单词,如不在字典里则用"?"替换。这里的核心是把()与其他的字符串区分开,这里采用双指针来实现。没有特别复杂的算法,这是以示例简单介绍一个实现的过程。这里需要一个start来标记(一个end来标记)。这样通过start与end可以确定()内的字符,以及未在()的字符串。下面通过上面示例给出双指针的处理过程。

初始start指向s的第一个字符,end指向-1,这是处理以(开始的字符串。
image.png

开始对整个字符串s进行遍历,当碰到(后,这里end+1到start的之间的字符串在()之外,直接把这个字符串加入到结果串。s中的第一个字符即为(,end为-1,end+1到0为空则括号外的字符串为空因此ans也为空。继续遍历到碰到)时,end指向)字符。这里start+到end之间的字符串为name。通过查找knowledge中的字典发现name需要替换为bob。结果如下:
image.png

继续进行遍历直到碰到下一个(字符串,start指向该字符串。同时标记end+1到start为()外的字符串,不需要处理直接加入到ans中。过程如下图。
image.png

最后到终止的时候需要处理一下把end+1到末尾的字符串直接加入到ans即可。
image.png

过程整理

到这里整个流程比较清晰了:

  • 1 把kowledge变成哈希表加速查找
  • 2 初始start=1,end=-1
  • 3 当碰到(时start变为当前索引,然后把end+1到start的字符串加入ans
  • 4 当遍历到),end更新为当前索引,判断start+1到end的字符串是否在knowledge中,如在value加到ans,不在"?"加入到ans。
  • 5 遍历结束把end+1到末尾的直接加入到ans。

代码

下面可以写代码了:

class Solution:
    def evaluate(self, s: str, knowledge: List[List[str]]) -> str:
        #knowledge要转换成dic
        knowledge_dic=dict(knowledge)
        n=len(s)
        start=0
        end=-1
        ans=""
        for i in range(len(s)):
            if s[i]=="(":
                start=i
                ans+=s[end+1:start]
            if s[i]==")":
                end=i
                word=s[start+1:end]
                print(word)
                if word in knowledge_dic:
                    ans+=knowledge_dic[word]
                else:
                    ans+="?"

        ans+=s[end+1:]
        return ans

计算复杂度

  • 时间复杂性:整个过程是一次遍历s,s的长度为n,则复杂度为 O ( n ) O(n) O(n),构建hash表示需要处理knowledge,kowledge的长度为k的话,复杂度为 O ( n ) O(n) O(n)。因此整体的时间复杂度为 O ( n + k ) O(n+k) O(n+k)
  • 空间复杂性:整个过程需要存储hash表与ans,因此复杂度为 O ( n + k ) O(n+k) O(n+k)

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

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

相关文章

android实现侧边栏:解决header控件无法操作和底部menuitem点击无效的问题

1:目录结构:(源码和总结都放在b站,链接在底部) 2:实现的大概逻辑: 使用drawerlayout抽屉布局实现,并使用navigationview加载头部和底部 3:核心问题一:header…

用Python来创建7种不同的文件格式

用Python来创建7种不同的文件格式一、用Python来创建7种不同的文件格式1.1、文本文件1.2、CSV文件1.3、Excel文件1.4、压缩文件1.5、XML文件1.6、JSON文件1.7、PDF文件一、用Python来创建7种不同的文件格式 1.1、文本文件 写入 file_name "my_text_file.txt"# 将…

微信小程序——WXML模板语法-条件渲染,列表渲染

一.条件渲染1.wx:if在小程序中,使用wx:if"{{condition}}"来判断是否需要渲染该代码块:也可以用wx:elif和wx:else来添加else判断:实例如下:1.在js文件中定义一个typedata:{type:1 },此时虚拟页面上显示的就是&#xff1a…

二十四、Kubernetes中Deployment(Deploy)控制器详解

1、概述 在kubernetes中,有很多类型的pod控制器,每种都有自己的适合的场景,常见的有下面这些: ReplicationController:比较原始的pod控制器,已经被废弃,由ReplicaSet替代 ReplicaSet&#xff…

kafka/bin/kafka-run-class.sh: line 342: exec: java: not found

本来jps看了下,kafka和zookeeper都起来了,手痒,非要换宝塔的进程守护管理器,选目录为/home/kafka,命令为/home/kafka/bin/zookeeper-server-start.sh /home/kafka/config/zookeeper.properties 就在日志里看到 kafk…

马蹄集 整除的总数

整除的总数 难度&#xff1a;白银 时间限制&#xff1a;1秒 巴占用内存&#xff1a;64M 输入正整数N和M,其中N<M。求区间[N,M]中可被K整除的总数。 格式 输入格式&#xff1a;输入正整数N,M和K,空格分隔。 输出格式&#xff1a;输出整型 #include <bits/stdc.h&g…

RabbitMQ(二)使用Docker安装

目录1. 拉取 RabbitMQ 镜像2.启动 RabbitMQ 容器3.查看 RabbitMQ 是否启动官网地址&#xff1a;https://www.rabbitmq.com/ 下载地址&#xff1a;https://www.rabbitmq.com/download.html 这篇文章为了方便初学者入门&#xff0c;在 linux 环境下用 docker 直接安装 RabbitMQ&…

【JavaSE】String相关知识

String \ StringBuilder \ StringBufferString的值是不可变的&#xff0c;使用“”或者“”的方法尝试改变String的值并不是在原本的基础上修改&#xff0c;而是赋值给了新的字符串常量引用StringBuffer是线程安全的&#xff0c;使用的是无脑加synchronized的方法这三者的运行速…

10分钟上手一款好用的服务器节点监测工具(Server 酱)

Server 酱简介 Server酱&#xff0c;英文名「ServerChan」&#xff0c;是一款「手机」和「服务器」、「智能设备」之间的通信软件。说人话&#xff1f;就是从服务器、路由器等设备上推消息到手机的工具。开通并使用上它&#xff0c;只需要一分钟&#xff1a; 微信扫码登入设置…

Mysql可视化软件-Navicat和SQLyog

Navicat 可以将mysql可视化的一个软件 可以避免一直在命令行里面敲代码&#xff0c;很难绷 连接 密码写一个你能记住的&#xff0c;不然打不开连接 对应的IP可以是localhost或者127.0.0.1 都是本机 端口号就我们在my.ini写的那个 然后进行我们上面说的操作-新建一个数据库先…

Linux操作系统常用命令

✅作者简介&#xff1a;热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏&#xff1a;Java案例分…

【uniapp】记录地址管理页面

uniapp中的地址管理页面 <template><view class"container"><view class"oldaddress" v-for"(item,index) in cardInfo" :key"index"><view class"topview"><view class"name">{{i…

线缆行业单绞机控制算法(详细图解+代码)

在了解单绞机之前需要大家对收放卷以及排线控制有一定的了解,不清楚的可以参看下面几篇博客,这里不再赘述,受水平和能力所限,文中难免出现错误和不足之处,诚恳的欢迎大家批评和指正。 收放卷行业开环闭环控制算法 PLC张力控制(开环闭环算法分析)_RXXW_Dor的博客-CSDN博…

Win10专业版系统Docker安装、配置和使用详细教程

一、win10专业版系统首先需要开启硬件虚拟化及Hyper-V功能&#xff0c;才能进行Docker for Windows软件安装。 如何开启硬件虚拟化&#xff0c;自行百度。可在任务栏中查看虚拟化是否开启。 win10系统&#xff0c;打开控制面板-“应用”-“程序和功能”&#xff0c;开启Hyper-V…

webpack 的基本使用

webpack 的基本使用配置 npm 镜像源创建列表隔行变色案例新建空白项目目录&#xff0c;初始化 package.json 配置文件通过 npm 安装 jquery新建 src 源代码目录index.htmlindex.js检查网页效果webpack 的安装webpack 的安装dependencies 与 devDependencies参数 -S 及 --save参…

【Linux工具】-yum/gdb

yum/gdb一&#xff0c;yum1&#xff0c;简介2&#xff0c;软件下载3&#xff0c;软件删除4&#xff0c;yum源与扩展yum源5&#xff0c;常见选项二&#xff0c;gdb1&#xff0c;简介2&#xff0c;gdb相关指令一&#xff0c;yum 1&#xff0c;简介 在Linux下&#xff0c;下载软…

中国芯片迎难而上,4纳米芯片量产,美媒:美国或肠子都悔青了

日前美国媒体《财富》杂志发表相关文章&#xff0c;认为对中国的芯片限制对美国是弊大于利&#xff0c;倒逼中国芯片加快芯片产业发展进程&#xff0c;而美国芯片却蒙受了太大的损失&#xff0c;与美国方面打擂台。美媒发表这篇文章之际&#xff0c;恰恰是中国芯片企业宣布近期…

TikTok不可思议的崛起

武汉瑞卡迪电子商务有限公司&#xff1a;《华尔街日报》网站11月5日发表题为《TikTok不可思议的崛起》的文章&#xff0c;全文摘编如下&#xff1a; 在短短五年里&#xff0c;TikTok已经爆发成为一种流行文化现象以及一个地缘政治闪爆点。它是全世界最热门的应用&#xff0c;被…

Vue纯前端:榜单管理系统

文章目录:一、主要功能&#xff1a;二、实现效果&#xff1a;1.主页:2.注册&#xff1a;3.登录&#xff1a;4.列表界面&#xff1a;5.添加应用界面&#xff1a;6.修改应用界面&#xff1a;7.模糊查询&#xff1a;三、整体架构&#xff1a;四、配置文件说明&#xff1a;五、功能…

icp备案号怎么申请?icp备案号哪里查询

ICP备案就是对网站的开办者信息的备案登记&#xff0c;以确保网站开办者的真实合法性。购买域名后&#xff0c;需要通过ICP备案才能开通域名解析服务。未通过ICP备案的网站&#xff0c;会有被查处关停的风险&#xff0c;备案的目的就是为了防止在网上从事非法的网站经营活动&am…