程序员面试金典 - 面试题 17.13. 恢复空格(DP+Trie树)

文章目录

    • 1. 题目
    • 2. 解题
      • 2.1 动态规划
      • 2.2 Trie树

1. 题目

哦,不!你不小心把一个长篇文章中的空格、标点都删掉了,并且大写也弄成了小写。
像句子"I reset the computer. It still didn’t boot!"已经变成了"iresetthecomputeritstilldidntboot"
在处理标点符号和大小写之前,你得先把它断成词语。
当然了,你有一本厚厚的词典dictionary,不过,有些词没在词典里。
假设文章用sentence表示,设计一个算法,把文章断开,要求未识别的字符最少,返回未识别的字符数。

注意:本题相对原题稍作改动,只需返回未识别的字符数

示例:
输入:
dictionary = ["looked","just","like","her","brother"]
sentence = "jesslookedjustliketimherbrother"
输出: 7
解释: 断句后为"jess looked just like tim her brother",共7个未识别字符。(jess tim)提示:
0 <= len(sentence) <= 1000
dictionary中总字符数不超过 150000。
你可以认为dictionary和sentence中只包含小写字母。

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

2. 解题

2.1 动态规划

  • dp[i] 表示包含 i 字符结尾的字符串 最少的未识别字符数,初始为 i+1(全部未识别)
  • 将 [ 0, i ] 区间切分,[ 0, j-1 ],[ j, i ] ,遍历所有的 j (j <= i)
  • 如果字典包含字符串 [ j, i ],dp[i]=min⁡(dp[i],dp[j−1])dp[i] = \min(dp[i], dp[j-1])dp[i]=min(dp[i],dp[j1])
  • 如果字典不包含字符串 [ j, i ],dp[i]=min⁡(dp[i],dp[j−1]+i−j+1)dp[i] = \min(dp[i], dp[j-1]+i-j+1)dp[i]=min(dp[i],dp[j1]+ij+1)
  • 一旦 dp[i] == 0,可以终止内层循环
class Solution {
public:int respace(vector<string>& dictionary, string sentence) {if(sentence.empty())return 0;int i, j, n = sentence.size();unordered_set<string> s;vector<int> dp(n,INT_MAX);for(auto& d : dictionary)s.insert(d);for(i = 0; i < n; ++i){dp[i] = i+1;if(s.count(sentence.substr(0,i+1))){dp[i] = 0;continue;}for(j = i; j > 0; --j){if(s.count(sentence.substr(j,i-j+1)))dp[i] = min(dp[i], dp[j-1]);elsedp[i] = min(dp[i], dp[j-1]+i-j+1);if(dp[i]==0)break;}}return dp[n-1];}
};

1156 ms 446.1 MB

2.2 Trie树

  • 在上面的思路下,将字典字符串反向插入trie树
  • 内层循环可以改为向前在trie树中查找存在的字符串最大长度,一旦不存在某个字符就不必再往前遍历了,因为肯定不存在,可以提高效率。
class trie
{
public:trie* cur;trie* next[26] = {NULL};bool isEnd = false;void insert(string& s){cur = this;for(int i = s.size()-1; i >= 0; --i)//反向插入{if(cur->next[s[i]-'a'] == NULL){cur->next[s[i]-'a'] = new trie();}cur = cur->next[s[i]-'a'];}cur->isEnd = true;}
};class Solution {
public:int respace(vector<string>& dictionary, string sentence) {if(sentence.empty())return 0;int i, j, n = sentence.size();unordered_set<string> s;trie *t = new trie(), *cur;for(auto& d : dictionary)t->insert(d);//字典插入trie树vector<int> dp(n,INT_MAX);for(i = 0; i < n; ++i){dp[i] = i+1;cur = t;for(j = i; j >= 0; --j)//从i处向前在trie树中查找单词{	if(cur->next[sentence[j]-'a'])//下一个字符存在{if(cur->next[sentence[j]-'a']->isEnd)//且是结束位置{if(j > 0)dp[i] = min(dp[i], dp[j-1]);elsedp[i] = 0;}else//不是结束位置,不匹配{if(j > 0)dp[i] = min(dp[i], dp[j-1]+i-j+1);elsedp[i] = min(dp[i], i-j+1);}}else//下一个字符不存在,可以结束了{if(j > 0)dp[i] = min(dp[i], dp[j-1]+i-j+1);elsedp[i] = min(dp[i], i-j+1);break;}if(dp[i]==0)	break;cur = cur->next[sentence[j]-'a'];}}return dp[n-1];}
};

120 ms 153.8 MB


我的CSDN博客地址 https://michael.blog.csdn.net/

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/476590.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2022的结尾,对话系统起飞了

文 | 郑楚杰知乎编者记&#xff1a;近日来&#xff0c;ChatGPT的连续刷屏让人们重新看到了AI的希望&#xff0c;编者通过对ChatGPT的试用&#xff0c;发现其对话能力早已不同于两年前的对话系统了&#xff0c;可以说&#xff0c;有了质的飞跃&#xff0c;向着用户体验奇点迈进了…

python清除列表内容_Python 列表的清空方式

情况列表的操作&#xff1a; del list[:] list[] list[:][] def func(L): L.append(1) print L #L[:][] #del L[:] L [] print L L[] func(L) print L 输出结果&#xff1a; [1] [] [1] 分析&#xff1a;L是可变数据类型&#xff0c;L作为参数&#xff0c;函数内对L的改变&…

ASP.NET小收集:Word的编码是Unicode

Word的编码是Unicode&#xff0c;从Word连接的超链接会附带Unicode编码进行打开&#xff0c;所以&#xff0c;如果没有对链接页面设定编码&#xff0c;将出现乱码&#xff0c;解决方法之一&#xff1a;设置编码为UTF-8<meta http-equiv"Content-Type" content&quo…

程序员面试金典 - 面试题 05.08. 绘制直线(位运算)

1. 题目 绘制直线。有个单色屏幕存储在一个一维数组中&#xff0c;使得32个连续像素可以存放在一个 int 里。 屏幕宽度为w&#xff0c;且w可被32整除&#xff08;即一个 int 不会分布在两行上&#xff09;&#xff0c;屏幕高度可由数组长度及屏幕宽度推算得出。 请实现一个函数…

FarPoint Spread For .Net 4.0

FarPoint Spread For .Net 4.0 ftp://ftp.fpoint.com/Trials/SpreadWinForm/spwin.zip http://www.fpoint.com:8080/files/Trials/SpreadWinForm/spwinframework35.zip 转载于:https://www.cnblogs.com/Tonyyang/archive/2008/06/23/1228133.html

入职比你晚,薪资比你高,礼貌吗

文&#xff5c; 穆胜咨询研究院源&#xff5c; 穆胜咨询秋招已过&#xff0c;企业迎来了许多新的面孔&#xff0c;对于很多老员工来说却是五味杂陈。新人空降拿到高工资&#xff0c;而自己的资历却换不来期待幅度的涨薪。“新老员工薪资倒挂”的问题&#xff0c;本就是HR的一道…

乐学python_【IT专家】铁乐学python

铁乐学 python 2018/04/18 13 铁乐学 python_day23_ 面向对象进阶 1_ 反射 以下内容大部分摘自博客 cnblogs/Eva-J/ isinstance() 和 issubclass() 两者的返回值都是布尔值 isinstance() 能够检测到继承关系 type() 只能单纯的判 断类 isinstance() 判断一个对象和一个类有没有…

程序员面试金典 - 面试题 16.14. 最佳直线(哈希map+set)

1. 题目 给定一个二维平面及平面上的 N 个点列表Points&#xff0c;其中第i个点的坐标为Points[i][Xi,Yi]。 请找出一条直线&#xff0c;其通过的点的数目最多。 设穿过最多点的直线所穿过的全部点编号从小到大排序的列表为S&#xff0c;你仅需返回[S[0],S[1]]作为答案 若有多…

Visual C# 2008+SQL Server 2005 数据库与网络开发--13.1.1 菜单创建

创建菜单的方法大体可以包括两种&#xff0c;比较简单的方法是通过Visual Studio 2008提供的菜单设计工具来创建&#xff0c;这种方式创建的菜单比较固定。另外一种方式是通过后台程序创建&#xff0c;这种方式由于通过代码在窗体菜单加载的时候完成&#xff0c;所以编写过程相…

c语言数据类型_C语言基础数据类型

点击上方“C语言中文社区”&#xff0c;选择“设为星标★”技术干货第一时间送达&#xff01;基本类型基本类型就是我们在使用C语言时最基础的数据类型&#xff0c;包括整形(短整型&#xff0c;基本整型&#xff0c;长整型)、字符型、浮点型(单、双精度)以及枚举类型。构造类型…

为辨别offer含金量,我做了个时薪计算器

文 | 曹宾玲源 | 表外表里提到计算机专业&#xff0c;大部分人第一时间会联想到“万金油专业”“大厂”和“高薪”。但在2023届计算机毕业生眼里&#xff0c;这已经是过去式了。以前被嫌弃的华子&#xff0c;今年校招群里挤满了人&#xff0c;即使一直泡在“人才池”里&#xf…

程序员面试金典 - 面试题 16.22. 兰顿蚂蚁(deque模拟)

1. 题目 一只蚂蚁坐在由白色和黑色方格构成的无限网格上。 开始时&#xff0c;网格全白&#xff0c;蚂蚁面向右侧。 每行走一步&#xff0c;蚂蚁执行以下操作。 (1) 如果在白色方格上&#xff0c;则翻转方格的颜色&#xff0c;向右(顺时针)转 90 度&#xff0c;并向前移动一个…

在程序中设置infopath中的整型等域值时出错解决方法

最近一直和infopath表单打交道&#xff0c;碰到的问题也比较多&#xff0c;刚刚就碰到一个在程序中修改infopath表单中域的内容时出错的问题&#xff0c;写出来与大家共享一下&#xff0c;我想这个问题&#xff0c;可能玩infopath的话&#xff0c;迟早会碰上的吧。具体表现就是…

python中如何输入矩阵_python - 如何向矩阵中添加向量_numpy_酷徒编程知识库

首先&#xff0c;我们可以初始化一个用零填充所需形状的矩阵&#xff0c;然后将a复制到前13行。在任何情况下&#xff0c;我们都必须形成一个新的矩阵&#xff0c;因为我们无法摆弄现有的矩阵/向量&#xff0c;因为我们需要为额外的空行分配更多的内存。 你可以在下面找到例子演…

聚类方法(Clustering)

文章目录1. 聚类基本概念1.1 相似度、距离1.2 类、簇1.3 类之间的距离2. 层次聚类3. K均值聚类3.1 模型3.2 策略3.3 算法3.4 算法特性4. sklearn.cluster4.1 sklearn.cluster.KMeans k均值聚类4.2 Hierarchical clustering 层次聚类聚类&#xff1a;依据样本特征的相似度或距离…

三十岁以前不必在乎的29件事

【放弃】把握的反面就是放弃&#xff0c;选择了一个机会&#xff0c;就等于放弃了其他所有的可能。当新的机会摆在面前的时候&#xff0c;敢于放弃已经获得的一切&#xff0c;这不是功亏一篑&#xff0c;这不是半途而废&#xff0c;这是为了谋求更大的发展空间&#xff1b;或者…

python写名片管理系统_Python实现名片管理系统

本文实例为大家分享了Python实现名片管理系统的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下 目标 综合应用已经学习过的知识点&#xff1a; 变量 流程控制 函数 模块 系统需求 1. 程序启动&#xff0c;显示名片管理系统欢迎界面&#xff0c;并显示功能菜单2 用户用…

程序员面试金典 - 面试题 17.24. 最大子矩阵(转成一维最大子序和 DP)

文章目录1. 题目2. 解题2.1 前缀和&#xff08;超时&#xff09;2.2 动态规划1. 题目 给定一个正整数和负整数组成的 N M 矩阵&#xff0c;编写代码找出元素总和最大的子矩阵。 返回一个数组 [r1, c1, r2, c2]&#xff0c;其中 r1, c1 分别代表子矩阵左上角的行号和列号&…

解决mysql表被crash的一次维护始末

有客户反馈&#xff22;&#xff2f;&#xff33;&#xff33;系统无法查询到6月28日以后的话单纪录&#xff0c;查询数据库后发现在执行对原始话单表执行查询时候偶尔出现 Table ***** is marked as crashed and should be repaired. 确定计费无误后决定在下班后执行对表的修复…

ICLR盲审阶段就被评审赞不绝口的论文:会是Transformer架构的一大创新吗?

编&#xff5c;杜伟、陈萍源&#xff5c;机器之心首次&#xff01;无残差连接或归一化层&#xff0c;也能成功训练深度transformer。尽管取得了很多显著的成就&#xff0c;但训练深度神经网络&#xff08;DNN&#xff09;的实践进展在很大程度上独立于理论依据。大多数成功的现…