博客
关于我
最长公共子序列
阅读量:577 次
发布时间:2019-03-11

本文共 901 字,大约阅读时间需要 3 分钟。

最长公共子序列

最近,我在学习关于最长公共子序列(LCS)的算法,它是一种经典的动态规划问题,广泛应用于字符串编辑、比对和模式匹配等领域。LCS的主要目标是找到两个字符串中最长的子序列,使得这个子序列在两个字符串中依次出现,虽然可能不连续,但顺序保持不变。比如,给定两个字符串"ABCBDAB"和"BCABD",它们的LCS是"BCAB",长度为4。

我记得在我的学习过程中,有一个步骤是通过创建一个二维表格来保存子序列的情况,每个表格单元格表示两个字符串在该位置的子序列长度。表格的行是第一个字符串的字符,列是第二个字符串的字符。对于每个字符对(i,j),表格中的值f(i,j)表示在处理到第i个字符和第j个字符时,最长的共公子序列的长度。

举个例子,处理到"AC"和"BC"时,f(0,0)=0,f(1,0)=0,f(0,1)=0,f(1,1)=0(因为第一次比较是A和B,不相等)。当处理到"A"和"C"时,f(2,2)=1,因为顺序是正确的,虽然不是连续的。接下来,当处理到最后的字符"AB"和"IDAB"时,最长的公共子序列是"AB",所以f(4,3)=2。

我发现,在编写表格时,要确保对角线上的值为0,因为两个不同的字符无法形成子序列,而是逐步添加。当处理到相同字符时,f(i,j)=f(i-1,j-1)+1,这样可以沿着对角线继续递增。当字符不同时,f(i,j)=max(f(i-1,j), f(i,j-1)),取决于前一个字符或左上的字符带来的值更大。

在实际操作中,我也遇到了一些困难,比如如何处理小写和大写字符,以及如何处理非字符型数据。通过仔细调整输入格式,我逐渐掌握了如何正确对比字符,并处理空值和特殊符号。

另外,我还研究了一些关于LCS的变种问题,比如允许插入、缺失或跳跃的最长公共子序列(LCSS)以及允许重复字符的最长公共子序列(LCSSU)。这些变种问题扩展了LCS的应用范围,尤其是在处理生物信息和语义分析时更加高效。

总的来说,学习LCS让我对字符串处理有了更深的理解。通过动态规划的方法,我不仅掌握了算法本身,还学会了如何解决类似的问题,灵活应对各种实际场景。

转载地址:http://hsbtz.baihongyu.com/

你可能感兴趣的文章
剑指offer[32]——把数组排成最小的数
查看>>
谈谈关于springboot 添加依赖的那些事
查看>>
CF1475-D. Cleaning the Phone
查看>>
java基础-java与c#接口不同点
查看>>
Java并发工具篇
查看>>
京喜小程序体验评分优化实践
查看>>
C#中文转换成拼音
查看>>
C#批量上传图片
查看>>
pyhon中安装win32com模块
查看>>
C++错误笔记
查看>>
【无线通信模块】GPRS DTU不稳定和容易掉线原因
查看>>
CSS(六)|页面布局之定位
查看>>
比特币(BSV)知识库:身份-BSVAlias
查看>>
比特币(BSV)知识库:网络-比特币测试用区块链(Bitcoin Test Blockchains)
查看>>
SpringBoot使用RedisTemplate简单操作Redis的五种数据类型
查看>>
国标流媒体服务器以ROOT身份运行提示“permission denide”报错解决
查看>>
国标流媒体服务器在linux系统运行提示fork/exec ……/redis/redis-server错误解决方案
查看>>
国标GB28181协议视频推流平台EasyGBD在Linux下编译报“UINT64_C在此作用领域中尚未声明”错误
查看>>
qt中转到槽后如何取消信号与槽关联
查看>>
qt问题记录-spin box与double spin box
查看>>