鱼C论坛

 找回密码
 立即注册
查看: 2396|回复: 9

请教查找子串问题

[复制链接]
发表于 2022-5-28 10:56:04 From FishC Mobile | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
请教大佬,Python查找含错子串个数有没有好的方法啊,就是只要不匹配的字符少于n个都认为是子串,我现在只会从头逐个往后找,有没有高级一点的方式
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-5-28 14:03:33 From FishC Mobile | 显示全部楼层
举个例子,听不懂
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-28 15:09:24 From FishC Mobile | 显示全部楼层
qq1151985918 发表于 2022-5-28 14:03
举个例子,听不懂

比如字符串'12345578901234567890',要查找子串'4567'的个数,不允许含错就是有1个,允许含一个错就是有2个
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-28 18:16:53 From FishC Mobile | 显示全部楼层
winchell 发表于 2022-5-28 15:09
比如字符串'12345578901234567890',要查找子串'4567'的个数,不允许含错就是有1个,允许含一个错就是有2 ...

这个太笼统了,你要找不含错很简单,要找含错的十分困难。比如在一个长度10000的字符串找一个长度100含错20的字符串简直难如登天。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-29 10:37:43 From FishC Mobile | 显示全部楼层
qq1151985918 发表于 2022-5-28 18:16
这个太笼统了,你要找不含错很简单,要找含错的十分困难。比如在一个长度10000的字符串找一个长度100含错 ...

额好吧,我现在的方法就是从头逐个过,比如先看比较第0到99个字符,然后比较第1到100个字符,倒是可以做出来,就是复杂度有点高了......
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-1 11:17:18 | 显示全部楼层
winchell 发表于 2022-5-29 10:37
额好吧,我现在的方法就是从头逐个过,比如先看比较第0到99个字符,然后比较第1到100个字符,倒是可以做 ...



滑动窗口算法了解下

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-1 11:44:26 From FishC Mobile | 显示全部楼层
winchell 发表于 2022-5-28 15:09
比如字符串'12345578901234567890',要查找子串'4567'的个数,不允许含错就是有1个,允许含一个错就是有2 ...

啥叫含错
那1234也是满足的,就是4个位置都错了而已
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-6-4 09:51:39 | 显示全部楼层
wp231957 发表于 2022-6-1 11:44
啥叫含错
那1234也是满足的,就是4个位置都错了而已

要求了最大含错数n的,n不同结果当然不同
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-6-7 20:50:06 | 显示全部楼层
不知道正则表达式能不能做到
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-8 00:44:59 | 显示全部楼层
本帖最后由 qq1151985918 于 2022-6-8 00:46 编辑
winchell 发表于 2022-6-7 20:50
不知道正则表达式能不能做到


看你一直没解决给你个简单代码吧,还是我跟你说的,如果字符串比较短容错值比较小可能还好,一旦数字很大是很庞大的计算量。没有你想的高级方式,只有穷举
  1. def compare(s1, s2):
  2.     """
  3.     :param s1: str -> 字符串 s1
  4.     :param s2: str -> 字符串 s2
  5.         :: 应当 len(s1) == len(s2) > 0
  6.     :return: int -> 返回 s1, s2 不同共几处
  7.     """
  8.    
  9.     d = 0
  10.     for x, y in zip(s1, s2):
  11.         if x != y:
  12.             d += 1
  13.     return d

  14. def find(s1, s2, n):
  15.     """
  16.     :param s1: str -> 字符串 s1 母串
  17.     :param s2: str -> 字符串 s2 目标子串
  18.     :param n: int -> 最大容错值
  19.         :: 应当 len(s1) >= len(s2) >= n
  20.     :return: list -> 返回所有符合条件的结果
  21.     """
  22.    
  23.     subsets = [s1[i:i+len(s2)] for i in range(len(s1)-len(s2)+1)]
  24.     res = [subset for subset in subsets if compare(subset, s2) <= n]
  25.     return res
  26.    
  27. if __name__ == '__main__':
  28.     s1 = '12345578901234567890'
  29.     s2 = '4567'
  30.     print(find(s1, s2, 0))
  31.     print(find(s1, s2, 1))
  32.    
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-28 10:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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