文章目录

  • 1. 题目
  • 2. 解题

1. 题目

给定一个关键词集合 words 和一个字符串 S,将所有 S 中出现的关键词加粗。所有在标签 <b> 和 </b> 中的字母都会加粗。

返回的字符串需要使用尽可能少的标签,当然标签应形成有效的组合。

例如,给定 words = ["ab", "bc"] 和 S = "aabcd",需要返回 "a<b>abc</b>d"。注意返回 "a<b>a<b>b</b>c</b>d" 会使用更多的标签,因此是错误的。

注:
words 长度的范围为 [0, 50]。
words[i] 长度的范围为 [1, 10]。
S 长度的范围为 [0, 500]。
所有 words[i] 和 S 中的字符都为小写字母。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/bold-words-in-string
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

同样题目:LeetCode 616. 给字符串添加加粗标签(Trie树)

  • 将集合里的单词全部插入trie树
  • 以S的每个位置为起点在trie树开始查找完整单词,记录可以加黑的地方,标记在bool数组里
class trie
{public:trie* next[26] = {NULL};bool isend =  false;int count = 0;void insert(string& s){trie* cur = this;for(int i = 0; i < s.size(); i++){if(cur->next[s[i]-'a'] == NULL)cur->next[s[i]-'a'] = new trie();cur = cur->next[s[i]-'a'];}cur->count++;cur->isend = true;}
};
class Solution {public:string boldWords(vector<string>& words, string S) {trie *t = new trie(), *cur;for(auto& w : words)t->insert(w);vector<bool> bold(S.size(), false);//加黑标记int boldl = 0, boldr=-1;//开始加粗的位置l,rfor(int i = 0, j; i < S.size(); ++i){cur = t;boldl = max(boldl, i);//加黑的地方左端点j = i;while(j < S.size() && cur && cur->next[S[j]-'a']){cur = cur->next[S[j]-'a'];if(cur->isend)boldr = j;//可以加黑的右端点j++;}while(boldl <= boldr)bold[boldl++] = true;//标记加黑}string ans;for(int i = 0; i < S.size(); ++i){if((i==0 && bold[i]) || (i>0 && !bold[i-1] && bold[i]))//i起点ans += "<b>";ans += S[i];if((i==S.size()-1 && bold[i]) || (i<S.size()-1 && bold[i] && !bold[i+1]))//i是终点ans += "</b>";}return ans;}
};

12 ms 11.2 MB


长按或扫码关注我的公众号,一起加油、一起学习进步!

LeetCode 758. 字符串中的加粗单词(Trie树)相关推荐

  1. 编写程序将字符串中最长的单词输出

    <程序设计基础-c语言>杨莉 刘鸿翔 ISBN-978-7-03-032903-5 p241 习题7 8.写一个函数,输入一段英文,将此字符串中最长的单词输出 #include<st ...

  2. java小编程----反转字符串中的每一个单词

    package com.henu.four;public class Test07_3 {// String str= "abc god 中国 java"(较难) 反转每个单词pu ...

  3. 统计字符串中出现最多的单词和次多的单词

    题目:统计字符串中出现最多的单词和次多的单词. 测试用例:"This This This a dog,not a cat!" 输出:This  3次  a  2次 思路:先把这个字 ...

  4. 用一个函数来实现将一行字符串中最长的单词输出。此行字符串从主函数传递给该函数.

    /2.用一个函数来实现将一行字符串中最长的单词输出.此行字符串从主函数传递给该函数./ #include <stdio.h> #include <string.h> int m ...

  5. 找字符串中最长单词C语言,C语言 在已知字符串中找最长单词

    编程在一个已知的字符串中找最长单词,假定字符串中只含字母和空格,空格用来分隔不同单词. 比如:"ni hao world",最长单词是5个字母 这个题目其实不难,但是很多初学者会没 ...

  6. c语言求出字符串最长单词,C语言 在字符串中找到最长单词

    满意答案 路飞的潮人店 2014.05.10 采纳率:59%    等级:9 已帮助:464人 我新写了一个,你看下吧, 主要用到了strtok()这个函数, 这个函数在做字符串切割时很有用的... ...

  7. (C语言)输入一行字符,将此字符串中最长的单词输出。

    输入一行字符,将此字符串中最长的单词输出. #include<stdio.h> #include<string.h> int main() {char a[100], b[10 ...

  8. Latex中如何加粗字体 如何打出圆圈序号

    1.latex中如何加粗字体? \textbf{文本} 我们举一个例子: \textbf{正式地说,PCA做的就是找到一个低维平面,然后将数据投影到上面.} 2.如何打出圆圈序号 如果序号不大的话可以 ...

  9. Android中字体加粗

    Android中字体加粗 Android中字体加粗 一.在xml文件中使用android:textStyle="bold" 二.但是不能将中文设置成粗体,将中文设置成粗体的方法是: ...

最新文章

  1. LeetCode中等题之重排数字的最小值
  2. android Json解析详解
  3. IOS固定IP对动态IP用pre-share
  4. Manage Jenkins管理界面提示“依赖错误: 部分插件由于缺少依赖无法加载...“问题解决办法
  5. pip install transformers出现拒绝访问
  6. Geoserver怎样设置地图不同路线显示不用颜色样式(同一个图层组设置多个图层不同样式)
  7. OpenGL 点光源的多遍阴影贴图
  8. android 验证码
  9. 在Project中引用zedgraph控件
  10. ueditor滚动条
  11. SpringBoot--自动装配之Import注解以及源码分析
  12. 超宽屏幕比例_显示器屏幕比例与分辨率对照表
  13. myeclipse误删文件恢复
  14. [置顶] 可惜了,没有人可以代替你自己的思考
  15. Altium Designer 18中的System–Design Insight
  16. 【opencv】双目视觉下空间坐标计算/双目测距 6/13更新
  17. Gap year | 最好金龟换酒
  18. Page Cache:为什么我的容器内存使用量总是在临界点?
  19. Java内存模型(JMM)
  20. excel表格末尾添加一行_这样输入Excel公式,也太快了吧......

热门文章

  1. 接口自动化测试 返回html,接口自动化测试实战(更新完毕)
  2. 字符设备驱动基础篇0——驱动开发初体验
  3. C++远航之封装篇——深拷贝、浅拷贝
  4. C++离航篇——函数默认参数、函数重载、内敛函数
  5. 恢复IE8自带的源代码查看器
  6. 应用程序池优化配置方案(IIS7、IIS7.5)
  7. 复制表、复制表结构、复制数据
  8. 使用HanLP增强Elasticsearch分词功能
  9. 康纳的表情包(思维)
  10. 初识设计模式(装饰者模式)