您的位置:首页 > 其它

获取两个字符串之间最长公共子串的长度

2016-09-09 12:09 337 查看
问题描述:给定两个字符串,编写程序获取两个字符串之间最长公共子串的长度。例如字符串s1= "GCCCTAGCCAGDE",字符串s2="GCGCCAGTGDE",这两个字符串的最长公共子串就是“GCCAG”,其长度为5。

这是来自别人的博客的一个问题。http://http://blog.csdn.net/dyoyo90/article/details/12754597

假设这句话是对的。那么s2里的子字符串一定会在s1里出现。那么s2一定是较短的一个。

别人的博客里写了一些方法。比如把所有的字符串取出逐个比较。所有我觉得用数据库来做比较快。

问题1.

如果单个字符匹配我觉得是很快就能找到的。比如我们找到了A的位置。那么A开头的字串都在这些位置开始。那么A就在S1中匹配两次。这样一次分词就 能把所有的字符位置写出来。得到这样两个个集合,比如SetAZ。SetBZ。做交叉运算。一个字母当然不如两个字母快,如果4比特表示一个字母的话。那么64位不是可以表示16个字符吗。当16个字符完全匹配的时候。我们觉得单次匹配速度会快一些。当1到16个字符都可以匹配时,第17个字符开始的下个字符。也可在SetAZ里面找到。当只匹配了15个字符时候,也是成功的,同时也要把这15个长的字符串加入到SetAZ里面,万一还有这样的呢。那这样的话。更多个字符放在一起不是更好嘛。所以有了加入过程。也就有了删除过程。

问题2.

也可以这样。生成两个自动机。

问题3.

使S1字符串收敛。比如连续的C记录为一个C。两个字符串之间比配。这样匹配上的都是子串。当S1的某段字符串包括了所有可能字符的时候。我们称为一次分组。每组对S2做比较。当每次比较失败后向右滑动。产生可能匹配。

问题4.

如果记录ABBC为一个正序,BA为一个逆序。这样的话。在每个字节8比特的条件下。符号位记录了0或1,后面7位记录了连续长度。连续数个记录为一个序列,这样的话,S1就形成了一个01的序列,同样S2也是这样的01序列,但同样的序列比如同为0100的时候,我们认为是可能匹配。当然,还要比较字符串长度。

问题5.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  字符串
相关文章推荐