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」,拉你进群一起学习。
网友评论