题目:
请找出一个字符串中没有重复字母的最长子串。
# 解法1
思路:
利用两层循环嵌套,将一个字母与其后字母进行拼接,遇到重复字母后,停止拼接,将已经拼接的不重复子串与当前最长不重复子串比较,如拼接的子串长于当前最长不重复子串,则更新最长不重复子串内容。继续下一次循环,直到第二层循环正常结束,再次判断已经拼接的不重复子串与当前最长不重复子串长度大小,结果取两者中最长,并结束第一层循环(第二层循环全部匹配后,不会再出现更长的不重复的子串)
算法:
1 定义一个变量max_substring,存储当前的最大子串,初始值为空
2 第一层循环,基于位置遍历每一个字母(for i in range(len(s)),遍历字母位置)
3. 声明临时变量temp,初始值为当前第一层循环的字母s[i](用于与后面的字母拼接)
4 第二层循环,基于第一层循环遍历当前位置i之后的所有字母---》for j in s[i+1:](遍历字母)
5. 判断第二层循环字母j是否在temp中(if j not in temp)
6. 如果不存在,则将temp与第二层遍历字母j进行拼接(temp+=j,拼接内容为不重复子串)
7. 如果存在,即字母有重复的时候,判断temp是否比目前的最大子串max_substring长(if len(temp)>len(max_substring))
8. 如果长,将temp赋值给当前的最大子串变量max_substring(max_substring=temp)
9. break跳出第二层循环,继续遍历第一次循环的下一个位置(即重复2-8)
10. 如果第二层循环已经遍历到最后都没有重复字母,则重复7-8步骤,并且break跳出第一层循环(因为第二层循环已经到最后都没有重复字母,继续进行第一层循环也不会再出现重复字母且获得的不重复子串会越来越短,所以第一层循环也不再进行)
11. 第一层循环结束后,得到的max_substring即为最长的不重复子串
示例:
对于字符串abcadefg,
1. 第一层循环遍历第一个位置字母a时,第二层循环a后面的字母bcadefg(for j in s[i+1:])
2. b和c不重复,触发if j not in temp,得到的temp=abc-->不重复的。
2. 当遇到这个句子第二个a的时候,else被触发了。
max_substring ="abc"
break
3. 跳出第二层循环,继续第一层循环,遍历b;第二层循环b后面的字母cadefg
4. 多次触发if j not in temp,直到第二层循环的最后一个字母,得到的temp=bcadefg
5. 在第二层循环所有字母部匹配完毕且没有重复的情况下,再判断temp(bcadefg)是否比max_substring(abc)的长度更长,结果是长于,所以max_substring=bcadefg。
# s = "sabcxsbedfgyzs"
s= "abcadefg"
max_substring = ""
for i in range(len(s)):
temp = s[i]
for j in s[i+1:]:
if j not in temp:
temp+=j
else: #结束后面字符的拼接
if len(temp)>len(max_substring):
max_substring=temp
break
else: # 第二层循环没有break,即没有遇到重复字母时执行此代码块
if len(temp)>len(max_substring):
max_substring=temp
break # 如果第二层循环结束且没有遇到重复字母,则中断第一层循环
# 因为再继续遍历,也不会再出现比当前最大不重复子串更长的子串了
print(max_substring)
# 解法2:
思路:
利用一层循环和一个临时变量,将当前位置字母与临时变量进行拼接,直到遇到重复字母,就停止拼接,将临时变量与当前最长不重复子串比较,如果长于当前最长不重复子串,则更新最长不重复子串为临时变量值。且将临时变量第一个重复字母左侧内容去掉,然后与当前遍历元素拼接,继续下一层循环,直到整个字符串遍历结束,再将临时变量与当前最长不重复子串比较,取两者中最长值。
算法:
1 定义一个变量max_substring,存储当前的最大子串,初始值为空
2. 定义变量temp,用于拼接不重复的字母,初始值为空
3. 第一层循环,基于位置遍历每一个字母(for i in range(len(s)),遍历字母位置)
4. 判断当前位置字母s[i]是否存在temp( if s[i] not in temp)
5. 如果不存在,则将temp与当前位置字母s[i]进行拼接(temp+=s[i],拼接内容为不重复子串)
6. 如果存在,即当前字母有重复的时候,判断temp是否比目前的最大子串max_substring长(if len(temp)>len(max_substring))
7. 如果长,将temp赋值给当前的最大子串变量max_substring(max_substring=temp)
8. 获取重复字母,即s[i]在temp中的位置(index = temp.index(s[i]))
9. 把temp的值修改为temp[index+1:]+s[i](即将temp中重复字符右边的内容截取,右边拼接当前元素,得到新的不重复子串)
10. 判断当前位置是否是字符串最后(ifi ==len(s)-1)
a) 如果是,用当前temp的长度和max_substring 长度比较(if len(temp)>len(max_substring)),如果大于,max_substring =temp,小于则忽略(避免字符串最后几位没有出现重复字符的时候,不会触发else语句对当前temp和max_substring进行比较,如果temp长度大于max_substring,也取不到,所以在最后位置时再进行一次判断)
b) 如果不是,则继续下一次循环
11. 循环结束后,得到的max_substring即为最长的不重复子串
示例:
对于字符串abcadefg,
1. 基于位置遍历字符串,b和c不重复,触发if s[i] not in temp:得到的temp=abc-->不重复的。
2. 当遇到这个句子第二个a的时候,else被触发了。
max_substring ="abc"
temp.index("a")--->0
temp[index+1:]--->1之后的所有内容(bc)
+s[i]---->temp:bca
3. 继续遍历:temp:bcadefg
4. 在字符串全部匹配完毕且没有重复的情况下,判断temp的长度是否大于max_substring的长度,结果大于,所以max_substring=bcadefg
# s = "sabcxsbedfgyzs"
s = "abcadefg"
max_substring = ""
temp = ""
for i in range(len(s)):
if s[i] not in temp:
temp+=s[i]
print("if temp拼接:",temp)
else:
if len(temp)>len(max_substring):
max_substring=temp
print("max_substing=",temp)
index = temp.index(s[i])
#对temp进行了截取,把最左边重复字符前面的部分去掉
temp = temp[index+1:]+s[i]
print("else 截取重复的部分:",temp)
if i ==len(s)-1: # 字符串遍历结束后,如果没有出现重复字母,需要判断当前的temp与max_substring的长度
iflen(temp)>len(max_substring):
max_substring=temp
print(max_substring)
最后: 下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】

软件测试面试文档
我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。



1万+

被折叠的 条评论
为什么被折叠?



