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))
提交leetcode的脚本

脚本逻辑:

  • 同样是使用"空桶理论",对原字符串字符进行遍历,并在遍历过程中与空桶元素进行对比
  • 对比过程中主要有以下几种情况:
    1. 空桶中没有遍历元素,则添加到空桶中
    2. 空桶中存在遍历元素,则先计算出当前最长的无重复字符串,然后将空桶中的某些元素剔除,最后把遍历元素添加到空桶中
    3. 遍历结束后,空桶的元素个数也为一个无重复字符串
  • 使用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            #最后返回记录最长字符串长度的变量

 


 

脚本二逻辑:

  • 此脚本的逻辑关键是最长无重复字符串一定位于字符串的某个位置,且是不重复的
  • 那么只需要一个一个遍历字符串,并与空集合进行比较,如果空集合中没有,则添加到空集合中;如果集合存在遍历元素,则剔除集合最左边的元素
  • 这种处理一定会遇到最长字符串,通过某些数值变量的变化处理即可获取目标值 
posted @ 2019-12-06 15:49  弈虫  阅读(142)  评论(0)    收藏  举报