无重复字符的最长子串

Python一个最大的特点是包含的函数很多,如果我们直接去死记硬背,效果肯定很差。所以,我们可以结合题目来学习函数,把每道题中的函数总结出来,这样学起来既不会枯燥乏味,效率也很高。

今天和大家分享的题目是,给定一个字符串,找出不含有重复字符的最长子串的长度。具体示例如下。

比如:“abcabcbb”找到的是“abc”,长度为3,而“bbbbb”找到的是“b”,长度为1,那么“abcabwbbd”的子字符串是什么?

小伙们想一想,这道题应该怎么解决呢?

我的思路是这样的:

1.首先通过定义函数的方法来解决;

2.将所有符合题目要求的字符串放在一个空的列表中;

3.定义两个参数,参数i的作用是在给定字符串个数的范围内遍历取值;

4.参数j的作用是,检测当前字符是否已经在字典中存在索引,如有检测到已经保存有索引并且索引值大于等于子串的起始位置,则表明移动j时,和i之间出现了重复字符,此时对比子串长度,并保留大的子串长度。同时,将子串起始位置移动到当前字符上一次出现的位置之后。

根据上述思路,编写的代码如下:

s1 = "abcabwbbd"

defmax_unique_str(s1=s1):

    for i in range(len(s1)):

        contain=[]

        contain.append(s1[i])

        for j in range(i+1,len(s1)):

            if s1[j] in contain:

                yield contain

                break

            else:

               contain.append(s1[j])

print(sorted([''.join(x)for x in max_unique_str(s1)],

             key=lambdax:len(x),reverse=True)[0])

下面介绍一下上面代码中出现的函数。

1.yield函数

带有yield的函数不再是一个普通函数,而是一个生成器generator,可用于迭代。

Yield是一个类似return的关键字,迭代一次遇到yield时就返回yield后面(左边)的值。重点是:下一次迭代时,从上一次迭代遇到的yield后面的代码(下一行)开始执行。

简要理解:yield就是return返回一个值,并且记住这个返回的位置,下次迭代就从这个位置后(下一行)开始。

在这里为了方便理解,我从网上找了一个例子。

defyield_test(n):

    for i in range(n):

       yield call(i)

        print("i=",i)


    #做一些其他的事情

    print("do something.")

    print("end.")


def call(i):

    return i*2


#使用for循环

for i inyield_test(5):

    print(i,",")

输出结果:

0 ,

i= 0

2 ,

i= 1

4 ,

i= 2

6 ,

i= 3

8 ,

i= 4

do something.

end.

2.join()函数

用于将序列中的元素以指定的字符串连接生成一个新的字符串。

语法是:str.join(sequence),sequence——要连接的元素序列。

返回值:返回通过指定字符连接序列中元素后生成新的字符串。

str=“—”;

seq=(“a”,“b”,“c”);

print str.join(seq)

输出结果:a-b-c

今天的题目理解起来还是有一定难度的,每日实战训练就到这里,如果小伙伴们还有其他的好的解法,欢迎交流。

最近一直在自学python,建了一个微信群,每天在群里分享每日学习python的干货,互相监督。有需要的小伙伴可以加下我的微信「WBQ130915」,拉你进群一起学习。

你可能感兴趣的:(无重复字符的最长子串)