ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-6-17 21:45 | 显示全部楼层

谢谢,你的代码也实现了我需要的功能。论坛的高手太多了

TA的精华主题

TA的得分主题

发表于 2015-6-17 21:49 | 显示全部楼层

思路好,缺点是改变了原来字符的大小写,如果加用01.Option Compare Text语句,就更好了。

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-6-17 21:59 | 显示全部楼层
ili 发表于 2015-6-17 21:40
AAABBBB 和AAACBBBB

由于我的数据特殊,一般不会出现这样的数据。
输入这样的数据,返回值是AAABBBB,7  
可能他的结果就是把大于3个字符的字符串都罗列出来,相同字符数字则是把前面列的字母数加起来。
总之对于我的应用来说,这个程序没有问题。

TA的精华主题

TA的得分主题

发表于 2015-6-17 22:04 | 显示全部楼层
本帖最后由 yjh_27 于 2015-6-18 15:18 编辑
dyho2010 发表于 2015-6-17 21:59
由于我的数据特殊,一般不会出现这样的数据。
输入这样的数据,返回值是AAABBBB,7  
可能他的结果就是 ...

自定义函数 雷同字符提取函数应用

原帖见签名

15L 说的对,本题是最长公共子串(Substring)

网上搜了一下:
最长公共子序列(Subsequence)是不连续的字符,最长公共子串(Substring)必须是连续的字符
LCS(最长公共子序列)和LD(最短编辑距离)是同一类问题。

TA的精华主题

TA的得分主题

发表于 2015-6-17 22:18 | 显示全部楼层
dyho2010 发表于 2015-6-17 21:59
由于我的数据特殊,一般不会出现这样的数据。
输入这样的数据,返回值是AAABBBB,7  
可能他的结果就是 ...

意思就是 如果你字符串前面有三个字符一样,后面有四个或者以上字符一样的时候,他会把满足条件的相同字符串一起列出来,而不是列出最长的一个。既然都能列出来,我想要改成只列出最长的应该不是很困难,你可以找他修改下。

其实这类问题就是  "最长公共子串 (LCS)" 的问题。网上有很多算法,有兴趣的可以网上搜索看看。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-6-17 22:37 | 显示全部楼层
ili 发表于 2015-6-17 22:18
意思就是 如果你字符串前面有三个字符一样,后面有四个或者以上字符一样的时候,他会把满足条件的相同字 ...

谢谢你的建议。
他这个程序是一个可以多用的模板,已经能满足我的要求,不好意思再麻烦他改。
并且要实现导出最长的公因子串,楼上两位高手的能够实现该功能。
感谢各位热心的网友帮助。
非常敬佩你们的技术,也非常感谢你们的热心帮助,希望以后能更多的向你们学习。

TA的精华主题

TA的得分主题

发表于 2015-6-18 12:52 | 显示全部楼层
自定义函数 =f(s1,s2,[n],[k])
1.s1/s2为比较对象字符串、必须参数。
2.n为相同字符最低个数、可选参数。默认n=3 可自己修改
  n>1时按以下比较模式返回相同字符串、而n=0则仅返回相同字符个数。
3.k为比较模式、可选参数。 默认k=1 可自己修改
  k=0时、区分大小写然后比较。
  k=1时、不区分大小写、比较后返回小写字符
  k=2时、不区分大小写、比较后返回大写字符
以上 Excel Home 香川群子 2015/6/18

  1. Function f(s1$, s2$, Optional n& = 3, Optional k& = 1)
  2.     If k = 1 Then s1 = LCase(s1): s2 = LCase(s2)
  3.     If k = 2 Then s1 = UCase(s1): s2 = UCase(s2)
  4.     If Len(s1) > Len(s2) Then s = s2: s2 = s1: s1 = s
  5.     For i = 1 To Len(s1) - n + 1
  6.         For j = IIf(n, n, 1) To Len(s1)
  7.             s = Mid(s1, i, j): m = InStr(s2, s)
  8.             If m Then If Len(s) > r Then r = Len(s): f = s
  9.         Next
  10.     Next
  11.     If n = 0 Then f = r
  12. End Function
复制代码

same str.zip

9.14 KB, 下载次数: 53

TA的精华主题

TA的得分主题

发表于 2015-6-18 13:05 | 显示全部楼层
本帖最后由 香川群子 于 2015-6-18 13:09 编辑

我的自定义函数、代码简单、算法高效且容易理解。

简单注释一下:

01.Function f(s1$, s2$, Optional n& = 3, Optional k& = 1)
02.    If k = 1 Then s1 = LCase(s1): s2 = LCase(s2) '如果k=1则转为小写然后比较、输出

03.    If k = 2 Then s1 = UCase(s1): s2 = UCase(s2) '如果k=2则转为小写然后比较、输出

      '而如果设置k=0 则字符串不处理、所以按区分大小写比较、输出



04.    If Len(s1) > Len(s2) Then s = s2: s2 = s1: s1 = s
         '选择字符长度较小的作为主动比较字符串s1 / 字符串长度较大的作为被动比较字符串s2
         '这么做效率高一些

         If n Then t = n Else t = 1 '如果n=0则从1开始

05.    For i = 1 To Len(s1) - n + 1
        '从s1的第1个字符串开始比较

06.        For j = IIf(r, r, t)  To Len(s1)
             '依次改变比较字符串的长度 直到最后一个字符串
            '为提高比较效率、直接从已知最大字符串r开始比较

07.            s = Mid(s1, i, j): m = InStr(s2, s)
                 '从当前位置起、在s1中mid截取长度为j的字符串s 并检查s2中是否含有

08.            If m Then If Len(s) > r Then r = Len(s): f = s
                 '如含有则 比较字符串个数是否更大、更大时更新字符串记录

09.        Next

10.    Next

11.    If n = 0 Then f = r '如果设置n=0时,则仅返回最大相同字符串个数。

12.End Function

TA的精华主题

TA的得分主题

发表于 2015-6-18 13:12 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
修改了一下附件。

same str2.zip

9.4 KB, 下载次数: 151

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-6-18 20:35 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

谢谢,你的程序很棒,且注释得很仔细,我这种小白也可以看的懂,我以后可以通过更改参数实现其他我想要的功能。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-15 12:58 , Processed in 0.046880 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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