博客昵称:沈小农学编程
作者简介:一名在读硕士,定期更新相关算法面试题,欢迎关注小弟!
PS:哈喽!各位CSDN的uu们,我是你的小弟沈小农,希望我的文章能帮助到你。欢迎大家在评论区唠嗑指正,觉得好的话别忘了一键三连哦!
题目难度:中等
默认优化目标:最小化时间复杂度。
Python默认为Python3。
目录
1 题目描述
2 题目解析
3 算法原理及代码实现
3.1 滑动窗口
参考文献
给定一个字符串 s
,请你找出其中不含有重复字符的 最长 子串的长度。
示例 1:
输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
提示:
0 <= s.length <= 5 * 104
s
由英文字母、数字、符号和空格组成
输入是一个字符串s
,输出是子串长度。约束条件为不包含重复字符的最长子串。
以pwwkew
为例,以(p)wwkew
开始的最长子串位(pw)wkew
;以p(w)wkew
开始的最长子串为p(w)wkew
;以pw(w)kew
开始的最长子串为pw(wke)w
;以pww(k)ew
开始的最长子串为pww(kew)
;以pwwk(e)w
开始的最大子串为pwwk(ew)
;以pwwke(w)
开始的最长子串为pwwke(w)
。
观察发现,当字符串s
从下标k位置开始,满足最长子串的位置为R_k。则从k+1的位置开始,到R_{k}位置字符必不重复。因此我们可以直接从R_{k+1}往后寻找满足条件的位置。
这样一来,就可以使用滑动窗口方法解决该问题。
· 设置两个指针left和right,分别指向k位置和R_{k}。
· 每一次操作,left右移一格,right向右移动直到遇到重复字符。记录这个子串长度。
· 更新最大长度maxLen。
时间复杂度为O(n),空间复杂度为O(|\sum|)。
C++代码实现
class Solution {
public:
int lengthOfLongestSubstring(string s) {
unordered_set occ;
int n=s.size();
int right=-1,maxLen=0;
for(int left=0;left
Python代码实现
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
occ=set()
n=len(s)
right,maxLen=-1,0
for left in range(n):
if(left!=0):
occ.remove(s[left-1])
while right
力扣面试经典150题
力扣官方题解