题目描述

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

示例 1:

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

示例 2:

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

示例 3:

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

提示:

  • $0 <= s.length <= 5 * 10^{4}$
  • $s$ 由英文字母、数字、符号和空格组成

分析

朴素的思想就是设置双重循环,外循环i根据字符串长度确定循环次数,内循环指针j指向,外循环当前的指针i,从j向后遍历一个字符,根据map的特性来得到本轮的最大无重复字串的长度,存储到temp,每轮内循环结束,就比较和max的大小,更新max.

流程图

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Solution {
public int lengthOfLongestSubstring(String s) {
int max=0; //存储最大无重复子串长度
int temp=0;
Map<Character,Integer> map=new HashMap<>();
for(int i=0;i<s.length();i++){
temp=0;
for(int j=i;j<s.length();j++){
if(map.containsKey(s.charAt(j))){
if(temp>max){
max=temp;
}
break;
}
else{
map.put(s.charAt(j), 1);
temp++;
}
if(s.length()-1==j){
if(temp>max){
max=temp;
}
}
}
map.clear();
}

return max;

}
}

进一步分析

其实这是一道滑动窗口问题

基本概念

滑动窗口是一种基于双指针的一种思想,两个指针指向的元素之间形成一个窗口。

分类:窗口有两类,一种是固定大小类的窗口,一类是大小动态变化的窗口。

应用:

  • 利用滑动窗口获取平滑的数据,如一段连续时间的数据平均值,能够有更好的稳定性,如温度监测。

什么情况可以用滑动窗口来解决实际问题呢?

  • 一般给出的数据结构是数组或者字符串
  • 求取某个子串或者子序列最长最短等最值问题或者求某个目标值时
  • 该问题本身可以通过暴力求解