ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: dyho2010

[已解决] 提取两个字符串中最大相同部分的字符串。

[复制链接]

TA的精华主题

TA的得分主题

发表于 2015-6-19 16:45 | 显示全部楼层

嗯,这样倒序查,确实速度效率更高!

主要是,第1个找到的一定是最大值,然后就可以直接退出计算了……


具体检查方法的2层循环,其实是差不多的。

TA的精华主题

TA的得分主题

发表于 2015-6-20 13:46 | 显示全部楼层
那么热闹,我也来发个,这种算法在两个超长字符串的比较中效率较高。
代码构建了两个2000个字符的DNA序列。
  1. Sub aaa()
  2.     Dim s1 As String, s2 As String
  3.    
  4.     Ar = Array("A", "C", "G", "T")
  5.     For I = 1 To 2000
  6.         s1 = s1 & Ar(Int(Rnd * 4))
  7.     Next
  8.     For I = 1 To 2000
  9.         s2 = s2 & Ar(Int(Rnd * 4))
  10.     Next
  11.    
  12.     t = Timer
  13.     a = LCS(s1, s2)
  14.     Debug.Print Timer - t
  15.     Debug.Print a
  16. End Sub
  17. Function LCS(ByVal Str1 As String, ByVal Str2 As String) As String
  18.     Dim I As Long, J As Long
  19.     Dim Ar, Br, Cr
  20.     Dim Max As Long, MaxR As Long
  21.     Dim s1  As String
  22.     s1 = Str1
  23.     Str1 = UCase(Str1)
  24.     Str2 = UCase(Str2)
  25.     ReDim Ar(1 To Len(Str1))
  26.     For I = 1 To Len(Str1)
  27.         Ar(I) = Mid(Str1, I, 1)     '将第一个字符串拆分为单个字符
  28.     Next

  29.     ReDim Br(1 To Len(Str2))
  30.     For I = 1 To Len(Str2)
  31.         Br(I) = Mid(Str2, I, 1)     '将第二个字符串拆分为单个字符
  32.     Next
  33.    
  34.     ReDim Cr(1 To Len(Str1))
  35.     For I = 1 To Len(Str2)
  36.         For J = Len(Str1) To 1 Step -1
  37.             If Ar(J) = Br(I) Then
  38.                 If I = 1 Or J = 1 Then
  39.                     Cr(J) = 1
  40.                 Else
  41.                      Cr(J) = Cr(J - 1) + 1
  42.                 End If
  43.             Else
  44.                 Cr(J) = 0
  45.             End If
  46.             If Cr(J) >= Max Then
  47.                 Max = Cr(J)
  48.                 MaxR = J
  49.             End If
  50.         Next
  51.     Next
  52.     LCS = Mid(s1, MaxR - Max + 1, Max)
  53. End Function
复制代码

TA的精华主题

TA的得分主题

发表于 2015-6-20 13:56 | 显示全部楼层
原理嘛,说难不难,说易不易。
如TCGCACGGAC 和 ATGGCTGCCA
如下图,对角线连续为1的即表示相同。
T C G CA
C GGA C
A 0 0 0 0 1 0 0 0 1 0
T 1 0 0 0 0 00 0 0 0
G 0 0 1 0 0 0 1 1 0 0
G0
0 1 0 0 0 1 1 0 0
C 0 1 0 1 01
0
001
T 1 0 0 0 0 0 0 0 0 0
G 0 0 1 0 0 0 1 1 0 0
C 01 0 1 0 1 0 0 0 1
C 0 1 0 1 0 1 0 0 01
A 00
0 0 1 0 0 0 1 0

TA的精华主题

TA的得分主题

发表于 2017-11-19 19:31 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
经测试,都很不错 ,借来一用,谢谢分享!

TA的精华主题

TA的得分主题

发表于 2023-5-13 10:06 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

嚯,大神果然是大神,我刚好以前就被这个问题困扰好久,最后无奈放弃,今天偶尔刷到此贴,真乃神人。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-15 12:32 , Processed in 0.034060 second(s), 6 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表