本文主要是介绍谷歌(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 中的所有值 互不相同
思路一:遍历
- 遍历字符串 s,并在每个位置检查是否存在 words 中的某个单词的前缀。
- 如果某个位置 i 是一个单词的前缀,并且在 i 之前不存在该单词的完整出现,则在 s 中的 i 位置添加 “” 标签,并记录该单词的结束位置 end。
- 继续遍历 s,找到该单词的结束位置 end,将 “” 标签添加到 end 位置后。
- 继续遍历 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>
这个函数根据输入的字符串和单词列表,添加加粗标签后返回字符串。
思路二:贪心算法
- 首先,创建一个长度为 s 的布尔数组
is_bold
,初始化为 False,用于记录字符串 s 中每个位置是否需要加粗标签。 - 遍历字符串 s 中的每个位置,对于每个位置 i,判断以该位置开始是否是 words 中某个单词的前缀。
- 如果是某个单词的前缀,则将从该位置开始到该单词结束的所有位置设为需要加粗标签。
- 遍历完所有单词后,得到
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 的长度。虽然时间复杂度较高,但思路清晰直观,实现简单。
思路三:字符串匹配
- 创建一个长度为 s 的布尔数组
is_bold
,初始化为 False,用于记录字符串 s 中每个位置是否需要加粗标签。 - 遍历字符串 s 中的每个位置,对于每个位置 i,判断以该位置开始是否是 words 中某个单词的前缀。
- 如果是某个单词的前缀,则尝试匹配该单词的完整出现,并将匹配成功的所有位置设为需要加粗标签。
- 遍历完所有单词后,得到
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)历年编程真题——给字符串添加加粗标签的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!