凌九霄 发表于 2023-4-15 10:40:22

最小子串

本帖最后由 凌九霄 于 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给出的解:
**** Hidden Message *****

歌者文明清理员 发表于 2023-4-15 10:50:07

双层隐藏,就是vip也得回复

凌九霄 发表于 2023-4-15 10:55:01

歌者文明清理员 发表于 2023-4-15 10:50
双层隐藏,就是vip也得回复

哦,怎么没想到呢{:5_109:}

isdkz 发表于 2023-4-15 11:02:50

你可以使用滑动窗口算法来解决这个问题。下面是一个用Python实现的解决方案:

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

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

    # 遍历字符串 a
    while right < len(a):
      # 当前子串为 a
      # 如果当前子串包含 b 和 c 的所有字符
      if contains_substring(a, b) and contains_substring(a, c):
            # 如果当前子串长度小于已知的最小子串长度,则更新最小子串长度和最小子串
            if right - left + 1 < min_len:
                min_len = right - left + 1
                min_substr = a
            # 如果当前子串长度等于已知的最小子串长度,但字典序较小,则更新最小子串
            elif right - left + 1 == min_len and a < min_substr:
                min_substr = a
            left += 1# 移动左指针
      else:
            right += 1# 移动右指针

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

a = 'abcd'
b = 'ab'
c = 'bc'
print(min_substring(a, b, c))# 输出: abc


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

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

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

如果找到了满足条件的子串,则返回该子串,否则返回"No"。

yangmy 发表于 2023-4-15 17:05:45

想看
页: [1]
查看完整版本: 最小子串