Leetcode_03【无重复字符的最长字串】
文章目录:
- 题目
- 脚本一及注释
- 脚本一逻辑
- 脚本二及注释
- 脚本二逻辑
题目:
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
脚本一及注释:【用时340ms】
#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处理好以上几种情况即可
脚本二及注释【用时44ms】
class Solution: def lengthOfLongestSubstring(self, s: str) -> int: if not s:return 0 left = 0 #定义一个变量left,用于记录集合中最左边字符,在字符串中对应的索引号 lookup = set() #定义一个空集合 n = len(s) #获取目标字符串的长度 max_len = 0 #记录当前记录的最长字符串长度 cur_len = 0 #记录集合中存在的元素个数 for i in range(n): #通过数列range对目标字符串进行遍历 cur_len += 1 #每次遍历记录集合元素个数的变量加一 while s[i] in lookup: #如果遍历元素存在于集合中,进入下面的判断 lookup.remove(s[left]) #移除集合中最左边的元素 left += 1 #相应的集合中最左边元素的索引号增加一 cur_len -= 1 #相应的集合当前的元素个数减一 if cur_len > max_len:max_len = cur_len #如果集合当前元素个数大于记录最长字符串长度,则将集合当前元素个数赋值给最长字符串长度的值 lookup.add(s[i]) #无论如何,每次遍历都需要把新的元素加入到集合中 return max_len #最后返回记录最长字符串长度的变量
脚本二逻辑:
- 此脚本的逻辑关键是最长无重复字符串一定位于字符串的某个位置,且是不重复的
- 那么只需要一个一个遍历字符串,并与空集合进行比较,如果空集合中没有,则添加到空集合中;如果集合存在遍历元素,则剔除集合最左边的元素
- 这种处理一定会遇到最长字符串,通过某些数值变量的变化处理即可获取目标值

浙公网安备 33010602011771号