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

相关文章

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

C#数据结构之字符串(string)详解

《C#数据结构之字符串(string)详解》:本文主要介绍C#数据结构之字符串(string),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录转义字符序列字符串的创建字符串的声明null字符串与空字符串重复单字符字符串的构造字符串的属性和常用方法属性常用方法总结摘

Java并发编程必备之Synchronized关键字深入解析

《Java并发编程必备之Synchronized关键字深入解析》本文我们深入探索了Java中的Synchronized关键字,包括其互斥性和可重入性的特性,文章详细介绍了Synchronized的三种... 目录一、前言二、Synchronized关键字2.1 Synchronized的特性1. 互斥2.

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优

Java实现时间与字符串互相转换详解

《Java实现时间与字符串互相转换详解》这篇文章主要为大家详细介绍了Java中实现时间与字符串互相转换的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、日期格式化为字符串(一)使用预定义格式(二)自定义格式二、字符串解析为日期(一)解析ISO格式字符串(二)解析自定义

python中字符串拼接的几种方法及优缺点对比详解

《python中字符串拼接的几种方法及优缺点对比详解》在Python中,字符串拼接是常见的操作,Python提供了多种方法来拼接字符串,每种方法有其优缺点和适用场景,以下是几种常见的字符串拼接方法,需... 目录1. 使用 + 运算符示例:优缺点:2. 使用&nbsjsp;join() 方法示例:优缺点:3

Python异步编程中asyncio.gather的并发控制详解

《Python异步编程中asyncio.gather的并发控制详解》在Python异步编程生态中,asyncio.gather是并发任务调度的核心工具,本文将通过实际场景和代码示例,展示如何结合信号量... 目录一、asyncio.gather的原始行为解析二、信号量控制法:给并发装上"节流阀"三、进阶控制

java字符串数字补齐位数详解

《java字符串数字补齐位数详解》:本文主要介绍java字符串数字补齐位数,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java字符串数字补齐位数一、使用String.format()方法二、Apache Commons Lang库方法三、Java 11+的St

C++字符串提取和分割的多种方法

《C++字符串提取和分割的多种方法》在C++编程中,字符串处理是一个常见的任务,尤其是在需要从字符串中提取特定数据时,本文将详细探讨如何使用C++标准库中的工具来提取和分割字符串,并分析不同方法的适用... 目录1. 字符串提取的基本方法1.1 使用 std::istringstream 和 >> 操作符示