鱼C论坛

 找回密码
 立即注册
查看: 2259|回复: 4

[技术交流] 最小子串

[复制链接]
发表于 2023-4-15 10:40:22 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 凌九霄 于 2023-4-15 10:55 编辑

题目描述:
给你三个字符串a, b, c (0 < len(a) <= 100, 0 < len(b), len(c) <= 20),请你找出a的某个子串,要求该子串长度最小,并且同时包含b和c。特别地,如果有多个这样的子串,则请输出字母序最小的一个,如果不存在这样的子串,输出No。 例如:a='abcd', b='ab', c='bc', 则输出:abc

找的题目都是稍有些难度的,下面是ChatGPT给出的解:
游客,如果您要查看本帖隐藏内容请回复
[/hide]
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-4-15 10:50:07 | 显示全部楼层
双层隐藏,就是vip也得回复
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-15 10:55:01 | 显示全部楼层
歌者文明清理员 发表于 2023-4-15 10:50
双层隐藏,就是vip也得回复

哦,怎么没想到呢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-15 11:02:50 | 显示全部楼层
你可以使用滑动窗口算法来解决这个问题。下面是一个用Python实现的解决方案:

  1. def min_substring(a, b, c):
  2.     # 辅助函数:判断字符串 s 是否包含 target 的所有字符
  3.     def contains_substring(s, target):
  4.         for ch in target:
  5.             if ch not in s:
  6.                 return False
  7.         return True

  8.     left, right = 0, 0  # 初始化左右指针
  9.     min_len = float("inf")  # 初始化最小子串长度为正无穷
  10.     min_substr = ""  # 初始化最小子串为空字符串

  11.     # 遍历字符串 a
  12.     while right < len(a):
  13.         # 当前子串为 a[left:right + 1]
  14.         # 如果当前子串包含 b 和 c 的所有字符
  15.         if contains_substring(a[left:right + 1], b) and contains_substring(a[left:right + 1], c):
  16.             # 如果当前子串长度小于已知的最小子串长度,则更新最小子串长度和最小子串
  17.             if right - left + 1 < min_len:
  18.                 min_len = right - left + 1
  19.                 min_substr = a[left:right + 1]
  20.             # 如果当前子串长度等于已知的最小子串长度,但字典序较小,则更新最小子串
  21.             elif right - left + 1 == min_len and a[left:right + 1] < min_substr:
  22.                 min_substr = a[left:right + 1]
  23.             left += 1  # 移动左指针
  24.         else:
  25.             right += 1  # 移动右指针

  26.     return min_substr if min_substr else "No"  # 如果找到了满足条件的子串,返回该子串,否则返回 "No"

  27. a = 'abcd'
  28. b = 'ab'
  29. c = 'bc'
  30. print(min_substring(a, b, c))  # 输出: abc
复制代码


这段代码定义了一个名为min_substring的函数,该函数接受三个字符串a、b和c作为参数,并返回a的满足题目要求的最小子串。

函数内部首先定义了一个名为contains_substring的辅助函数,用于检查一个字符串是否包含另一个字符串的所有字符。

接下来,使用双指针滑动窗口算法,在字符串a中查找满足条件的最小子串。

如果找到了满足条件的子串,则返回该子串,否则返回"No"。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-15 17:05:45 | 显示全部楼层
想看
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-24 12:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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