力扣LeetCode刷题日记(二)

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

示例 1:

输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:

输入: “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:

输入: “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        len_max = 0  # 最长的字串长度
        len_str = 0  # 当前的字串长度
        list_str = []  # 保存无重复的子串
        
        for a in s:  # 遍历字符串
            if a in list_str:  # 当前遍历的字符在前面的子串中已经存在
                if len(list_str) > len_max:
                    len_max = len(list_str)
                # 将列表中保存的子串重复字符以及前面的字符全部删除
                while list_str[0] != a:
                    del list_str[0]
                del list_str[0]
                # 当前遍历的字符加入字串中
                list_str.append(a)
            else:  # 当前遍历的字符在字串中没有重复
                list_str.append(a)
        if len(list_str) > len_max:
            len_max = len(list_str)
        return len_max       

解决这道题中犯了很蠢的错误,找了很久都没找到原因。在实现功能将列表中保存的子串重复字符以及前面的字符全部删除的时候,一开始采用如下代码:

 # 将列表中保存的子串重复字符以及前面的字符全部删除
 				i = 0
                while i < len(list_str):
                	if list_str[0] != a:
                		del list_str[0]
                		i += 1
                	else:
                		del list_str[0]
                		break

在后来调试的时候,发现while循环内部总是只循环一次,可是len(list_str)的值为2,循环没有理由不执行两次。苦思冥想许久,突然发现每次循环都del一次导致列表长度减1,所以循环永远至进行一次。
初学python对语法和一些内置函数还不熟悉,再加上很久没做过编程题,在这种低级错误上浪费太多时间。

你可能感兴趣的:(LeetCode刷题)