无重复字符的最长子串
Posted tsdblogs
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无重复字符的最长子串相关的知识,希望对你有一定的参考价值。
题目:无重复字符的最长子串。
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
解法思路:
初始化一个 哈希表字典 dic
头指针start 初始为0
当前指针 cur 初始为0
最大长度变量 l 初始为0
用cur变量从给定字符串str的开头开始 一位一位的向右查看字符,直到整个字符串遍历完, 对每一位字符进行如下:
当前位置的字符为 c = str[cur]
查询当前字符 c 是否 在哈希表dic的键 当中,表示 当前字符c 是否之前遍历到过
如果 当前字符还没出现过,就 在dic中记录一个键值对 (当前字符c,当前位置cur )
cur 后移一位
如果 当前字符出现过, 获取 当前字符串c 上次出现的位置 pre = dic[c]
如果pre 在 start后面即 pre>start, 则把start 移动到 pre的下一位, start = pre + 1, 这样保证cur继续向后遍历中 从start到cur没有重复元素
否则 start不动,start移动到某一个位置,说明在这个位置之前有重复的元素了,所以start只往后移动不往回移动
这时候在衡量一下 如果 cur - start + 1 (衡量当前没重复子串开头到结尾的长度) 比 长度变量 l 大, 那就替换 l 为 cur - start + 1
代码:
class Solution: def lengthOfLongestSubstring(self, s): """ :type s: str :rtype: int """ l = 0 start = 0 dic = {} for i in range(len(s)): cur = s[i] if cur not in dic.keys(): dic[cur] = i else: if dic[cur] + 1 > start: start = dic[cur] + 1 dic[cur] = i if i - start + 1 > l: l = i - start + 1 return l
以上是关于无重复字符的最长子串的主要内容,如果未能解决你的问题,请参考以下文章