Вам дана строка s и массив строк words. Вы должны добавить закрытую пару полужирных тегов <b> и </b>, чтобы обернуть подстроки в s, которые существуют в words. Если две такие подстроки пересекаются, вы должны обернуть их вместе только одной парой закрытых полужирных тегов. Если две подстроки, обернутые полужирными тегами, идут подряд, вы должны объединить их. Верните s после добавления полужирных тегов.
Пример:
Input: s = "abcxyz123", words = ["abc","123"]
Output: "<b>abc</b>xyz<b>123</b>"
C# решение
сопоставлено/оригиналpublic class Solution {
public string AddBoldTag(string s, string[] words) {
int n = s.Length;
bool[] bold = new bool[n];
foreach (var word in words) {
int start = s.IndexOf(word);
while (start != -1) {
for (int i = start; i < start + word.Length; i++) {
bold[i] = true;
}
start = s.IndexOf(word, start + 1);
}
}
var result = new StringBuilder();
int j = 0;
while (j < n) {
if (bold[j]) {
result.Append("<b>");
while (j < n && bold[j]) {
result.Append(s[j]);
j++;
}
result.Append("</b>");
} else {
result.Append(s[j]);
j++;
}
}
return result.ToString();
}
}
C++ решение
auto-draft, проверить перед отправкой#include <bits/stdc++.h>
using namespace std;
// Auto-generated C++ draft from the C# solution. Review containers, LINQ and helper types before submit.
class Solution {
public:
public string AddBoldTag(string s, vector<string> words) {
int n = s.size();
bool[] bold = new bool[n];
foreach (var word in words) {
int start = s.IndexOf(word);
while (start != -1) {
for (int i = start; i < start + word.size(); i++) {
bold[i] = true;
}
start = s.IndexOf(word, start + 1);
}
}
var result = new StringBuilder();
int j = 0;
while (j < n) {
if (bold[j]) {
result.Append("<b>");
while (j < n && bold[j]) {
result.Append(s[j]);
j++;
}
result.Append("</b>");
} else {
result.Append(s[j]);
j++;
}
}
return result.ToString();
}
}
Java решение
сопоставлено/оригиналpublic class Solution {
public String addBoldTag(String s, String[] words) {
int n = s.length();
boolean[] bold = new boolean[n];
for (String word : words) {
int start = s.indexOf(word);
while (start != -1) {
for (int i = start; i < start + word.length(); i++) {
bold[i] = true;
}
start = s.indexOf(word, start + 1);
}
}
StringBuilder result = new StringBuilder();
int i = 0;
while (i < n) {
if (bold[i]) {
result.append("<b>");
while (i < n && bold[i]) {
result.append(s.charAt(i));
i++;
}
result.append("</b>");
} else {
result.append(s.charAt(i));
i++;
}
}
return result.toString();
}
}
JavaScript решение
сопоставлено/оригиналfunction addBoldTag(s, words) {
const n = s.length;
const bold = Array(n).fill(false);
for (const word of words) {
let start = s.indexOf(word);
while (start !== -1) {
for (let i = start; i < start + word.length; i++) {
bold[i] = true;
}
start = s.indexOf(word, start + 1);
}
}
let result = "";
let i = 0;
while (i < n) {
if (bold[i]) {
result += "<b>";
while (i < n && bold[i]) {
result += s[i];
i++;
}
result += "</b>";
} else {
result += s[i];
i++;
}
}
return result;
}
Python решение
сопоставлено/оригиналdef addBoldTag(s, words):
n = len(s)
bold = [False] * n
for word in words:
start = s.find(word)
while start != -1:
for i in range(start, start + len(word)):
bold[i] = True
start = s.find(word, start + 1)
result = []
i = 0
while i < n:
if bold[i]:
result.append("<b>")
while i < n and bold[i]:
result.append(s[i])
i += 1
result.append("</b>")
else:
result.append(s[i])
i += 1
return "".join(result)
Go решение
сопоставлено/оригиналpackage main
import (
"strings"
)
func addBoldTag(s string, words []string) string {
n := len(s)
bold := make([]bool, n)
for _, word := range words {
start := strings.Index(s, word)
for start != -1 {
for i := start; i < start+len(word); i++ {
bold[i] = true
}
start = strings.Index(s, word, start+1)
}
}
var result strings.Builder
i := 0
for i < n {
if bold[i] {
result.WriteString("<b>")
for i < n && bold[i] {
result.WriteByte(s[i])
i++
}
result.WriteString("</b>")
} else {
result.WriteByte(s[i])
i++
}
}
return result.String()
}
Algorithm
Найдите все позиции вхождений подстрок из words в строку s и пометьте эти позиции для выделения тегами <b> и </b>.
Пройдитесь по помеченным позициям, чтобы определить области, которые нужно обернуть в полужирные теги, слияя пересекающиеся и смежные области.
Постройте новую строку s, добавляя теги <b> и </b> в определенные позиции.
😎
Вакансии для этой задачи
Показаны активные вакансии с пересечением по тегам задачи.