文章目录:
- 题目
- 效果展示
- 脚本及注释
- 脚本逻辑
题目:
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
效果展示:
脚本及注释:
#conding:gbk str = 'abcabcc' list1 = list(str) #将字符串转换为列表 long_list = [] #创建一个空的列表用于存储无重复字符串的长度 zidian = {} #创建一个空字典用于遍历对比 for i,j in enumerate(list1): #使用枚举的方法遍历字符串列表 if j in zidian: #当字典存在值为"j"的键时进入判断 changd = i - min(zidian.values()) #获取当前无重复字符串的长度 num = zidian[j] #获取键为"j"对应的值,称为“定点” for ak in list(zidian.items()): #由于不能在遍历字典过程中修改字典,所以使用list方法临时将字典转换为列表,注意:items和keys、values转换的结果不一样 if ak[1] <= num: #如果字典元素的值少于或等于定点的值,进入判断 del zidian[ak[0]] #删除字典中此元素 long_list.append(changd) #在空列表中增加当前无重复字符串的长度 zidian[j] = i #将新的列表元素添加到字典中 else: #如果字典不存在键为“j”,则将遍历对象的索引号及元素值添加到字典中 【此方法沿用了笔者上一条博客中的习惯】 zidian[j] = i long_list.append(len(zidian)) #遍历完成后,计算字典中还存在的元素个数,并添加到存储长度的列表中 print(max(long_list)) #获取列表中最大的值即为目标字符串的最长无重复字符串的长度
class Solution: def lengthOfLongestSubstring(self, s: str) -> int: list1 = list(s) long_list = [] zidian = {} for i,j in enumerate(list1): if j in zidian: changd = i - min(zidian.values()) num = zidian[j] for ak in list(zidian.items()): if ak[1] <= num: del zidian[ak[0]] long_list.append(changd) zidian[j] = i else: zidian[j] = i long_list.append(len(zidian)) return(max(long_list))
脚本逻辑:
- 同样是使用"空桶理论",对原字符串字符进行遍历,并在遍历过程中与空桶元素进行对比
- 对比过程中主要有以下几种情况:
- 空桶中没有遍历元素,则添加到空桶中
- 空桶中存在遍历元素,则先计算出当前最长的无重复字符串,然后将空桶中的某些元素剔除,最后把遍历元素添加到空桶中
- 遍历结束后,空桶的元素个数也为一个无重复字符串
- 使用python处理好以上几种情况即可