为了健康而进行一些递归:
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(或其他输入)