【问题标题】:finding the minimum window substring找到最小窗口子串
【发布时间】:2021-01-09 19:32:48
【问题描述】:

问题说要创建一个字符串,从字符串中取出 3 个不连续的字符并将其放入一个子字符串中,然后打印第一个是哪个字符,最后一个是哪个字符。

str="subliminal"
sub="bmn"

n = len(str)-3

for i in range(0, n):
    print(str1[i:i+4])
    if sub1 in str1:
        print(sub1[i])

这应该打印 3 到 8,因为 b 是第三个字母,n 是第 8 个字母。

我也不知道如何在不完全更改代码的情况下使代码适用于不是 3 个字符长的子字符串。

【问题讨论】:

    标签: python python-3.x substring


    【解决方案1】:

    不确定这是否是您的意思。我假设子字符串已经有效,这意味着它包含不连续的字母。然后我得到子字符串的第一个和最后一个字母,并使用列表推导创建字符串中所有字母的列表。然后我只是遍历字母并保存第一个和最后一个字母出现的位置。如果缺少什么,hmu。

    sub = "bmn"
    str = "subliminal"
    
    first_letter = sub[0]
    last_letter = sub[-1]
    
    start = None
    end = None
    
    letters = [let for let in str]
    
    for i, letter in enumerate(letters):
        if letter == first_letter:
            start = i
        if letter == last_letter:
            end = i
    
    if start and end:
        print(f"From %s to %s." % (start + 1, end + 1)) # Output: From 3 to 8.
    

    【讨论】:

      【解决方案2】:

      为了健康而进行一些递归:

      def minimum_window_substring(strn, sub, beg=0, fin=0, firstFound=False):
      
          if len(sub) == 0 or len(strn) == 0:
              return f'From {beg + 1} to {fin}'
          elif strn[0] == sub[0]:
      
              return minimum_window_substring(strn[1:], sub[1:], beg, fin + 1, True)
      
          if not firstFound:
              beg += 1
          return minimum_window_substring(strn[1:], sub, beg, fin + 1, firstFound)
      

      解释:

      基本情况是,如果我们得到原始字符串或子字符串的长度为 0,然后我们停止并打印原始字符串中子字符串的开头和结尾。

      如果当前字符串的第一个字母相等,那么我们启动计数器(我们用标志“firstFound”固定开头的“beg”)然后递增直到我们完成(sub 是一个空字符串/原始字符串是空的)

      思考/更多解释:

      例如,如果您要求子字符串 first 出现,例如原始字符串是否为 "sububus ubulum" 和 sub 将等于 "sbl" 然后当我们点击我们的第一个 "s" - 这意味着它将 100% 从那里开始,因为如果另一个 "sbl" 在原始字符串内 - 那么它必须包含剩余的字母,因此我们会说它们属于第一个 s。 (一个可怕的解释,我很抱歉)我想说的是,如果我们有 2 次出现的子字符串 - 那么我们会选择第一个,无论如何。

      注意:这个函数并不真正关心sub-string是否包含连续的字母,也不检查字符是否在字符串本身,因为你说我们必须从原始字符串中获得字符。积极的一面是,该函数可以给出多于(或少于)3 个字符长的子字符串

      当我说“原始字符串”时,我的意思是 subliminal(或其他输入)

      【讨论】:

      • 谢谢你的回答,它有效 :) 我能问一下“firstFound”标志是干什么用的吗?
      • @ohmygod 标志是停止增加开始,如果我们找到开始 - 我们将它设置为 True 意味着我们找到它并开始计数。因为我无法评论其他人的答案,所以我会在这里说,Honn 的答案并不完整,因为它无法识别重复项,例如在字符串 subliminal 上尝试 sub = "lma"lml,当然,你只能将其用于 3+ 个字母,而不是例如 2 个。实际上,它也不适用于常规输入,例如sia..
      【解决方案3】:

      有很多不同的方法可以做到这一点,

      这是一个灵魂,

      import re 
      def Func(String, SubString):
          patt = "".join([char + "[A-Za-z]" + "+" for char in sub[:-1]] + [sub[-1]])
          MatchedString = re.findall(patt, String)[0]
          FirstIndex = String.find(MatchedString) + 1
          LastIndex = FirstIndex + len(MatchedString) -1 
          return FirstIndex, LastIndex
      string="subliminal"
      sub="bmn"
      FirstIndex, LastIndex = Func(string, sub)
      

      这将返回 3、8 并且您可以更改子字符串的长度,并假设您只想要第一个匹配项

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-29
        • 1970-01-01
        • 2013-10-09
        • 1970-01-01
        • 1970-01-01
        • 2020-06-26
        • 1970-01-01
        • 2019-08-21
        相关资源
        最近更新 更多