前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >无重复字符的最长子串

无重复字符的最长子串

作者头像
stormwen
发布2019-08-05 20:18:01
6270
发布2019-08-05 20:18:01
举报
文章被收录于专栏:公众号:googpy公众号:googpy

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

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

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

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

我的思路是这样的:

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

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

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

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

同时,将子串起始位置移动到当前字符上一次出现的位置之后。

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

s1 = "abcabwbbd"

def max_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=lambda x:len(x),reverse=True)[0])

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

yield函数

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

yield是一个类似return的关键字,迭代一次遇到yield时就返回yield后面(左边)的值。

重点是:下一次迭代时,从上一次迭代遇到的yield后面的代码(下一行)开始执行。

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

——stormwen

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

def yield_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 in yield_test(5):

print(i,",")

输出结果:

0 ,

i= 0

2 ,

i= 1

4 ,

i= 2

6 ,

i= 3

8 ,

i= 4

do something.

end.

join函数

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

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

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

str=“—”;

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

print str.join(seq)

输出结果:a-b-c

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-01-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 googpy 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档