测开小练习:请找出一个字符串中没有重复字母的最长子串

文摘   科技   2024-08-30 00:09   北京  
关注我们,一起学习+涨薪不掉队!

文 | 三毛和荷西
软件如何高效交付?这里有答案!免费送书ing!

分享你的测试成长经历,吴老师免费送书 !

题目:

请找出一个字符串中没有重复字母的最长子串。

# 解法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_substringmax_substring=temp
9. break跳出第二层循环,继续遍历第一次循环的下一个位置(即重复2-8
10. 如果第二层循环已经遍历到最后都没有重复字母,则重复7-8步骤,并且break跳出第一层循环(因为第二层循环已经到最后都没有重复字母,继续进行第一层循环也不会再出现重复字母且获得的不重复子串会越来越短,所以第一层循环也不再进行)
11. 第一层循环结束后,得到的max_substring即为最长的不重复子串
示例:
对于字符串abcadefg
1. 第一层循环遍历第一个位置字母a时,第二层循环a后面的字母bcadefgfor j in s[i+1:]
2. bc不重复,触发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. 在第二层循环所有字母部匹配完毕且没有重复的情况下,再判断tempbcadefg)是否比max_substringabc)的长度更长,结果是长于,所以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_substringmax_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语句对当前tempmax_substring进行比较,如果temp长度大于max_substring,也取不到,所以在最后位置时再进行一次判断)
b)      如果不是,则继续下一次循环
11. 循环结束后,得到的max_substring即为最长的不重复子串
示例:
对于字符串abcadefg
1. 基于位置遍历字符串,bc不重复,触发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]---->tempbca
3. 继续遍历:tempbcadefg
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)

刷算法题有用吗?

1
你是工程师吗?

工程师是技术干部的职务名称之一。请关注“技术”二字!否则,请问你和用户有何区别?

2
你是正在或打算从事测试开发吗?

测试开发,开发在后面,核心还是开发,要写代码,要写代码,要写代码!

3
你是为了面试涨薪吗?

通常,测试能获得好的待遇一般在大公司,没点难度随便进?没点技术门槛公司从哪挣钱?除非付费人傻!


4
所有语言都离不开算法,你认同吗?

C、C++、java、javascript、python、英语、中文,要想交流简介通畅且效率高,没点算法支撑如何实现?

Just do it!


免费领取三节测试开发试听课
链接:https://pan.baidu.com/s/1nKqINq42KWm-hupBoebBWw
提取码:k5fv

无论上课或自学,

你首先需要准备:

每天 2 小时+的学习时间

每天坚持写代码的习惯!

有投入才有产出,

10k+的涨幅需要 1 年以上的努力!

祝你成功!


光荣之路出品

测试大佬和小白的故事

2020年度测试现状报告

自动化测试的目标

手把手教你pytest测试框架

测开必备-flask网站开发

IOS真机移动端App+H5混合自动化测试实战

产品测试规范

内推:字节跳动 | 测试开发

招聘QQ群:203715128

光荣之路
关注光荣之路软件技术培训账号,即时收取测试开发技术的免费公开课信息,各大公司测试及开发招聘信息、最新的技术咨询、线下测试技术分享沙龙信息
 最新文章