Huge Lemon的博客

无重复字符的最长子串

2020-02-09

LeetCode 3. Longest Substring Without Repeating Characters

题目描述

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

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

示例 2:

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

示例 3:

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

思路

这道题主要用到思路是:滑动窗口

什么是滑动窗口?

其实就是一个队列,比如例题中的 abcabcbb,进入这个队列(窗口)为 abc 满足题目要求,当再进入 a,队列变成了 abca,这时候不满足要求。所以,我们要移动这个队列!

如何移动?

我们只要把队列的左边的元素移出就行了,直到满足题目要求!

一直维持这样的队列,找出队列出现最长的长度时候,求出解!

时间复杂度:$O(n)$






图片来源:无重复字符的最长子串 c++实现三种解法 多重循环,hashmap优化,桶优化

滑动窗口题目

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int lengthOfLongestSubstring(char * s){
int size = strlen(s);
int i=0, j, k, max = 0;
//j 作为外部循环变量,遍历字符串的每一个元素
//i 初始指向当前检测到的重复元素的下一个元素索引
//k 用于遍历从 i 到 j 的子串
for(j = 0; j < size; j++) {
for(k = i; k < j; k++)
if(s[k] == s[j]) {
i = k + 1;
break;
}
if(j - i + 1 > max)
max = j - i + 1;
}
return max;
}
使用支付宝打赏
使用微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏