谷歌(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

相关文章

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2

C#中字符串分割的多种方式

《C#中字符串分割的多种方式》在C#编程语言中,字符串处理是日常开发中不可或缺的一部分,字符串分割是处理文本数据时常用的操作,它允许我们将一个长字符串分解成多个子字符串,本文给大家介绍了C#中字符串分... 目录1. 使用 string.Split2. 使用正则表达式 (Regex.Split)3. 使用

Java中JSON字符串反序列化(动态泛型)

《Java中JSON字符串反序列化(动态泛型)》文章讨论了在定时任务中使用反射调用目标对象时处理动态参数的问题,通过将方法参数存储为JSON字符串并进行反序列化,可以实现动态调用,然而,这种方式容易导... 需求:定时任务扫描,反射调用目标对象,但是,方法的传参不是固定的。方案一:将方法参数存成jsON字

C#反射编程之GetConstructor()方法解读

《C#反射编程之GetConstructor()方法解读》C#中Type类的GetConstructor()方法用于获取指定类型的构造函数,该方法有多个重载版本,可以根据不同的参数获取不同特性的构造函... 目录C# GetConstructor()方法有4个重载以GetConstructor(Type[]

python解析HTML并提取span标签中的文本

《python解析HTML并提取span标签中的文本》在网页开发和数据抓取过程中,我们经常需要从HTML页面中提取信息,尤其是span元素中的文本,span标签是一个行内元素,通常用于包装一小段文本或... 目录一、安装相关依赖二、html 页面结构三、使用 BeautifulSoup javascript

【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垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。