谷歌(Google)历年编程真题——给字符串添加加粗标签

2024-04-10 09:28

本文主要是介绍谷歌(Google)历年编程真题——给字符串添加加粗标签,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

谷歌历年面试真题——数组和字符串系列真题练习。

给字符串添加加粗标签

给定字符串 s 和字符串数组 words。

对于 s 内部的子字符串,若其存在于 words 数组中, 则通过添加闭合的粗体标签 <b> 和 </b> 进行加粗标记。

如果两个这样的子字符串重叠,你应该仅使用一对闭合的粗体标签将它们包围起来。
如果被粗体标签包围的两个子字符串是连续的,你应该将它们合并。
返回添加加粗标签后的字符串 s 。

示例 1:

输入: s = “abcxyz123”, words = [“abc”,“123”]
输出:“<b>abc</b>xyz<b>123</b>”
解释:两个单词字符串是 s 的子字符串,如下所示: “abcxyz123”。 我们在每个子字符串之前添加<b>,在每个子字符串之后添加</b>。

示例 2:

输入:s = “aaabbb”, words = [“aa”,“b”]
输出:“<b>aaabbb</b>”
解释: "aa"作为子字符串出现了两次: “aaabbb” 和 “aaabbb”。 "b"作为子字符串出现了三次: “aaabbb”、“aaabbb” 和 “aaabbb”。 我们在每个子字符串之前添加<b>,在每个子字符串之后添加</b>:
“<b>a<b>a</b>a</b><b>b</b><b>b</b><b>b</b>”。 由于前两个<b>重叠,把它们合并得到:
“<b>aaa</b><b>b</b><b>b</b><b>b</b>”。 由于现在这四个<b>是连续的,把它们合并得到:
"<b>aaabbb</b> "。

提示:

  • 1 <= s.length <= 1000
  • 0 <= words.length <= 100
  • 1 <= words[i].length<= 1000
  • s 和 words[i] 由英文字母和数字组成
  • words 中的所有值 互不相同

思路一:遍历

  1. 遍历字符串 s,并在每个位置检查是否存在 words 中的某个单词的前缀。
  2. 如果某个位置 i 是一个单词的前缀,并且在 i 之前不存在该单词的完整出现,则在 s 中的 i 位置添加 “” 标签,并记录该单词的结束位置 end。
  3. 继续遍历 s,找到该单词的结束位置 end,将 “” 标签添加到 end 位置后。
  4. 继续遍历 s,直到所有单词的前缀都被处理完毕。

下面是相应的 Python 代码实现:

def addBoldTag(s, words):n = len(s)bold_positions = [False] * nfor word in words:start = 0while start < n:start = s.find(word, start)if start == -1:breakfor i in range(start, start + len(word)):bold_positions[i] = Truestart += 1ans = ''i = 0while i < n:if bold_positions[i]:ans += "<b>"while i < n and bold_positions[i]:ans += s[i]i += 1ans += "</b>"else:ans += s[i]i += 1return ans# 示例 1
s1 = "abcxyz123"
words1 = ["abc", "123"]
print(addBoldTag(s1, words1))  # 输出:<b>abc</b>xyz<b>123</b># 示例 2
s2 = "aaabbb"
words2 = ["aa", "b"]
print(addBoldTag(s2, words2))  # 输出:<b>aaabbb</b>

这个函数根据输入的字符串和单词列表,添加加粗标签后返回字符串。

思路二:贪心算法

  1. 首先,创建一个长度为 s 的布尔数组 is_bold,初始化为 False,用于记录字符串 s 中每个位置是否需要加粗标签。
  2. 遍历字符串 s 中的每个位置,对于每个位置 i,判断以该位置开始是否是 words 中某个单词的前缀。
  3. 如果是某个单词的前缀,则将从该位置开始到该单词结束的所有位置设为需要加粗标签。
  4. 遍历完所有单词后,得到 is_bold 数组,然后根据该数组生成最终的结果字符串。

下面是相应的 Python 代码实现:

def addBoldTag(s, words):n = len(s)is_bold = [False] * nfor word in words:start = 0while start < n:start = s.find(word, start)if start == -1:breakfor i in range(start, start + len(word)):is_bold[i] = Truestart += 1ans = ''i = 0while i < n:if is_bold[i]:ans += "<b>"while i < n and is_bold[i]:ans += s[i]i += 1ans += "</b>"else:ans += s[i]i += 1return ans# 示例 1
s1 = "abcxyz123"
words1 = ["abc", "123"]
print(addBoldTag(s1, words1))  # 输出:<b>abc</b>xyz<b>123</b># 示例 2
s2 = "aaabbb"
words2 = ["aa", "b"]
print(addBoldTag(s2, words2))  # 输出:<b>aaabbb</b>

这个解法的时间复杂度为 O(n * m),其中 n 是字符串 s 的长度,m 是单词列表 words 的长度。虽然时间复杂度较高,但思路清晰直观,实现简单。

思路三:字符串匹配

  1. 创建一个长度为 s 的布尔数组 is_bold,初始化为 False,用于记录字符串 s 中每个位置是否需要加粗标签。
  2. 遍历字符串 s 中的每个位置,对于每个位置 i,判断以该位置开始是否是 words 中某个单词的前缀。
  3. 如果是某个单词的前缀,则尝试匹配该单词的完整出现,并将匹配成功的所有位置设为需要加粗标签。
  4. 遍历完所有单词后,得到 is_bold 数组,然后根据该数组生成最终的结果字符串。

下面是相应的 Python 代码实现:

def addBoldTag(s, words):n = len(s)is_bold = [False] * nfor word in words:start = 0while start < n:start = s.find(word, start)if start == -1:breakend = start + len(word)for i in range(start, end):is_bold[i] = Truestart += 1ans = ''i = 0while i < n:if is_bold[i]:ans += "<b>"while i < n and is_bold[i]:ans += s[i]i += 1ans += "</b>"else:ans += s[i]i += 1return ans# 示例 1
s1 = "abcxyz123"
words1 = ["abc", "123"]
print(addBoldTag(s1, words1))  # 输出:<b>abc</b>xyz<b>123</b># 示例 2
s2 = "aaabbb"
words2 = ["aa", "b"]
print(addBoldTag(s2, words2))  # 输出:<b>aaabbb</b>

这个解法的时间复杂度为 O(n * m * L),其中 n 是字符串 s 的长度,m 是单词列表 words 的长度,L 是单词的平均长度。虽然时间复杂度较高,但实现简单直观。

这篇关于谷歌(Google)历年编程真题——给字符串添加加粗标签的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/890671

相关文章

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

EMLOG程序单页友链和标签增加美化

单页友联效果图: 标签页面效果图: 源码介绍 EMLOG单页友情链接和TAG标签,友链单页文件代码main{width: 58%;是设置宽度 自己把设置成与您的网站宽度一样,如果自适应就填写100%,TAG文件不用修改 安装方法:把Links.php和tag.php上传到网站根目录即可,访问 域名/Links.php、域名/tag.php 所有模板适用,代码就不粘贴出来,已经打

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。

Go Playground 在线编程环境

For all examples in this and the next chapter, we will use Go Playground. Go Playground represents a web service that can run programs written in Go. It can be opened in a web browser using the follow

深入理解RxJava:响应式编程的现代方式

在当今的软件开发世界中,异步编程和事件驱动的架构变得越来越重要。RxJava,作为响应式编程(Reactive Programming)的一个流行库,为Java和Android开发者提供了一种强大的方式来处理异步任务和事件流。本文将深入探讨RxJava的核心概念、优势以及如何在实际项目中应用它。 文章目录 💯 什么是RxJava?💯 响应式编程的优势💯 RxJava的核心概念

函数式编程思想

我们经常会用到各种各样的编程思想,例如面向过程、面向对象。不过笔者在该博客简单介绍一下函数式编程思想. 如果对函数式编程思想进行概括,就是f(x) = na(x) , y=uf(x)…至于其他的编程思想,可能是y=a(x)+b(x)+c(x)…,也有可能是y=f(x)=f(x)/a + f(x)/b+f(x)/c… 面向过程的指令式编程 面向过程,简单理解就是y=a(x)+b(x)+c(x)

消除安卓SDK更新时的“https://dl-ssl.google.com refused”异常的方法

消除安卓SDK更新时的“https://dl-ssl.google.com refused”异常的方法   消除安卓SDK更新时的“https://dl-ssl.google.com refused”异常的方法 [转载]原地址:http://blog.csdn.net/x605940745/article/details/17911115 消除SDK更新时的“

每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟

每日一题|四舍五入 四舍五入 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目: 牛牛发明了一种新的四舍五入应用于整数,对个位四舍五入,规则如下 12345->12350 12399->12400 输入描述: 输入一个整数n(0<=n<=109 ) 输出描述: 输出一个整数