社区首页 >问答首页 >确定字符串S中需要修改的最小字符数的算法

确定字符串S中需要修改的最小字符数的算法
EN

Stack Overflow用户
提问于 2018-08-28 06:39:03
回答 2查看 1.8K关注 0票数 0

几天前我遇到了一个编程挑战,现在已经结束了。问题是给定一个小写英文字母的字符串S,找出字符串S中需要更改的最小字符数,以便它包含给定的单词W作为S中的子字符串。

另外,在下一行中,按升序打印需要更改的字符位置。由于可以有多个输出,因此找到要更改的第一个字符最少的位置。

我尝试使用LCS,但只能得到需要更改的字符数。如何找到字符的位置?我可能漏掉了什么,请帮帮忙。可能会有其他算法来解决这个问题。

EN

回答 2

Stack Overflow用户

发布于 2018-08-28 08:01:10

显而易见的解决方案是在输入字符串S上移动参考词W,并计算差异。然而,对于非常长的字符串,这将变得效率低下。那么,我们如何改进这一点呢?

我们的想法是将搜索的目标定位在S中很可能与W匹配的地方。找到这些点是关键的部分。如果不执行朴素算法,我们就无法有效和准确地找到它们。因此,我们使用启发式H,它为我们必须执行的更改数量提供了一个下限。我们为S的每个位置计算这个下限。然后,我们从最低H的位置开始,检查该位置的SW的实际差异。如果下一个更高的H高于当前的差值,我们已经完成了。如果不是,我们检查下一个位置。该算法的概要如下:

代码语言:javascript
代码运行次数:0
复制
input:
    W of length LW
    S of length LS

H := list of length LS - LW + 1 with tuples [index, mincost]
for i from 0 to LS - LW
    H(i) = [i, calculate Heuristic for S[i .. i + LW]]
order H by mincost
actualcost = infinity
nextEntryInH = 0
while actualcost >= H[nextEntryInH].minCost && nextEntryInH < length(H)
    calculate actual cost for S[H[nextEntryInH].index .. + LW]
    update actualcost if we found a lesser cost or equal cost with an earlier difference
    nextEntryInH++

现在,回到启发式。我们需要找到一些东西,允许我们近似给定位置的差异(我们需要保证它是一个下限),同时又易于计算。因为我们的字母表是有限的,所以我们可以使用字母的直方图来实现这一点。因此,让我们假设注释中的示例:W = worldcup,我们感兴趣的S部分是worstcap。这两个部分的直方图是(省略不出现的字母):

代码语言:javascript
代码运行次数:0
复制
         a c d l o p r s t u w
worldcup 0 1 1 1 1 1 1 0 0 1 1  
worstcap 1 1 0 0 1 1 1 1 1 0 1 
------------------------------
abs diff 1 0 1 1 0 0 0 1 1 1 0  (sum = 6)

我们可以看到,绝对差和的一半是我们需要更改的字母数的适当下限(因为每次字母更改都会使总和减少2)。在这种情况下,界限甚至很紧,因为总和等于实际成本。但是,我们的启发式算法没有考虑字母的顺序。但归根结底,这就是它可有效计算的原因。

好的,我们的启发式算法是直方图的绝对差值之和。现在,我们如何有效地计算它呢?幸运的是,我们可以递增地计算直方图和总和。我们从位置0开始计算完整的直方图和绝对差异的总和(请注意,在运行时的其余时间内,W的直方图永远不会改变)。有了这些信息,我们就可以设置H(0)了。

为了计算H的其余部分,我们在S上滑动窗口。当我们将窗口向右滑动一个字母时,我们只需要更新直方图并稍微求和:窗口中恰好有一个新字母(添加到直方图中),一个字母离开窗口(从直方图中删除)。对于两个(或一个)对应的字母,计算绝对差异总和的结果变化并更新它。然后,相应地设置H

使用这种方法,我们可以在线性时间内计算整个字符串S的启发式。启发式给我们一个指示,我们应该在哪里寻找匹配。一旦我们有了它,我们就继续执行这个答案开头概述的剩余算法(从启发式较低的地方开始精确的成本计算,并继续直到实际成本超过下一个更高的启发式值)。

票数 2
EN

Stack Overflow用户

发布于 2018-08-28 07:42:47

LCS (=最长的公共子序列)将不起作用,因为W和S中的公共字母需要具有匹配的位置。因为您只允许更新,而不允许删除/插入。

如果允许移除/插入,则可以使用Levenshtein距离:https://en.wikipedia.org/wiki/Levenshtein_distance

在您的情况下,一个明显的强力解决方案是在每个位置将W与S匹配,复杂度为O (N *M) (S的N大小,W的M大小)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52051567

复制
相关文章
kubesphere无法更新项目
        kubesphere集群部署了一段时间了,今天需要更新镜像版本,然而在kubesphere页面点击”重新部署“按钮,虽然页面提示”部署成功“,但实际上没一点反应,kubephere关于这个问题可以优化下,如下图所示。
johnhuster的分享
2022/11/07
1.5K0
kubesphere无法更新项目
pycharm 如何更新本地项目文件[通俗易懂]
本地更新项目文件后,pycharm不会自动更新导航栏的文件目录,运行程序时报错,找不到文件:
全栈程序员站长
2022/09/25
1.1K0
pycharm 如何更新本地项目文件[通俗易懂]
EasyCVR更新版本后无法清除数据库已删除文件,该如何解决?
EasyCVR视频融合云服务基于云边端一体化架构,具有强大的数据接入、处理及分发能力,平台支持海量视频汇聚管理,可提供视频监控直播、云端录像、云存储、录像检索与回看、智能告警、平台级联、语音对讲、智能分析等视频能力。
TSINGSEE青犀视频
2023/02/07
8300
项目打包成 jar 后包无法读取src/main/resources下文件
该代码功能是利用 common.io 包下的FileUtils来读取文件, 放到一个字符串中
时间静止不是简史
2022/05/06
13.4K0
项目打包成 jar 后包无法读取src/main/resources下文件
Pages 无法使用此AppleID更新
无法更新是因为这个应用并没有绑定到已经登录的AppleID中,点击已购,会提示有应用需要接受,点击全部接受。输入几次密码之后再次更新就ok了、
obaby
2023/02/23
9920
Debian 无法更新和镜像源
位于一台德国的vps, 用的 Debian, 这个逼最近, 突然apt-get 不好使了. 各种error .
chuchur
2023/09/13
9430
vue项目中swiper动态更新后无法轮播问题 附带案例代码
swiper是很常用的一个组件,我项目中用到的版本是4.1.6。刚开始,我就按照官网的案例写了个demo,当然图片都是静态写死的,确实可以轮播了,但是我项目的需求是要动态修改轮播图的内容。然后我就改成vue的方式了,js和css是通过cdn引入的。下面是swiper的全部代码: 有问题请加群交流java群:200909980,vue群:128806068 ,或者在下边评论 vue template 代码 轮播内容是通过循环数组自动生成的 <div class="swiper-container" v-
码农笔录
2018/06/29
2.2K0
matlab中importdata无法打开文件_importdata无法打开文件
最近使用importdata函数不能读取全部数据,数据集315行,但是读取了197行,那就是197-198之间有问题,百度之后有了思路。由于没有找到具体的证据,所以这里说一下解决思路。
全栈程序员站长
2022/11/16
6.2K0
matlab中importdata无法打开文件_importdata无法打开文件
安防视频监控平台EasyCVR数据库字段无法更新,如何优化?
关于EasyCVR数据库相关的技术文章,我们在前期也分享了很多,包括功能优化及疑难问题解决等,感兴趣的用户可以翻阅我们往期的文章进行了解。近期我们对EasyCVR数据库的字段进行了优化,今天来和大家分享一下。
TSINGSEE青犀视频
2022/07/20
6250
jar命令更新SpringBoot项目jar包里的补丁文件
最近在因为项目依赖了太多微服务的包,所以项目经常报错,又因为在联调接口,需要经常打包,所以想直接在springboot项目的一个jar包直接加上自己的补丁,然后重新部署就行,提高效率
SmileNicky
2022/09/21
2.4K0
GitHub 更新:更新 timeline & 相似项目推荐
一大早在微信群里,听说 GitHub 更新了,打开电脑一看果然是更新了。首页的动态发生了一些变化: 这一下子,能看到的东西比以前更少了。每天要涨那么多 star 的我,有点纠结。 与此同时,开始为您推
Phodal
2018/01/29
1.5K0
案例详解:Linux文件系统异常导致数据库文件无法访问
墨墨导读:某客户单位数据库出现异常,大致现象是:数据库状态是open的,但是其中一个数据文件无法访问,本文分享排查原因与解决问题的整个过程。
数据和云
2020/06/01
1.7K0
beegfs 7.3.2更新后服务无法启动
beegfs 7.3.2版本默认强制身份验证身份。所以在安装或升级后,没有配置authfile会导致服务无法启动。
姚华
2023/02/22
2K0
IMP-00002: 无法打开 F:\Work\项目\数据库文件\gi_data.dmp; 进行读取
IMP-00002: 无法打开 F:\Work\项目\新疆\数据库文件\gi_data.dmp; 进行读取 导入文件: EXPDAT.DMP>
西门呀在吹雪
2020/11/09
2.7K0
IMP-00002: 无法打开 F:\Work\项目\数据库文件\gi_data.dmp; 进行读取
kali修改更新源(无法安全的用该源更新)
因为kali是国外的,所以一些软件你要下载的话得从国外的网站下载,就会很慢,国内一些公司或者学校提供了国内的下载地址,所以我们需要更换更新源
全栈程序员站长
2022/07/25
1.8K0
解决 WordPress 无法自动检查更新
自 wordpress 3.7开始,自动更新已经默认开启。小版本更新将全自动运行,无需人工干预。但在 reizhi 的博客却遇到了一些问题,wordpress 不但无法自动更新,在更新界面也看不到最新的版本信息。如下图所示,下载后本应显示服务器端最新版本号,但在此只显示了一个横线。起初以为是版本号丢失,但查看 wordpress 后台底部却能够正确显示当前版本。重装过数次虽然能短暂解决,过一段时间之后又再次出现。 
reizhi
2022/09/26
1.4K0
解决 WordPress 无法自动检查更新
ActionScript项目无法调试[通俗易懂]
C:\WINDOWS\system32\Macromed\Flash\Flash10b.ocx
全栈程序员站长
2022/11/04
4900
Qt项目网络聊天室设计
3. 服务器接收到某个客户端的请求以及发送信息,经服务器发给其它客户端 最终实现一个共享聊天内容的聊天室!
DeROy
2020/08/19
2.4K0
Qt项目网络聊天室设计
GitHub文件下载慢?无法克隆项目?多种方法提升项目下载与克隆体验
GitHub,或许是全球最大的代码托管与开源社区了。虽然现在代码托管,可以使用Coding,并且可以和腾讯云服务器很好的有机结合(比如:Coding作为仓库,腾讯云轻量应用服务器作为K8s发布平台,实现自动化部署),但是如果是需要代码开源和社区反馈,往往还是选择GitHub。
Mintimate
2022/05/26
3K0
GitHub文件下载慢?无法克隆项目?多种方法提升项目下载与克隆体验
tomcat项目无法启动
1.打开未加载成功的项目属性,即Properties 2.点开Depolyment Assembly,查看web.xml目录是否有添加在其中,即红框,未添加则添加,即可解决tomcat启动没有加载项目,因为找不到web.xml 3.webapp这个路径是因为该项目为maven项目,所以必须配置这个路径,否则会启动失败,找不到相关的jar包
Java架构师必看
2021/05/19
2K0

相似问题

将html按钮单击与objective c绑定

10

通过objective-c触发HTML按钮单击?

21

在C++代码中处理HTML按钮单击事件

11

批注中的objective c mapkit单击按钮

11

在objective c中单击按钮时的容器视图

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文