【剑指Offer3】无重复字符的最长子串
原文链接:https://blog.csdn.net/qq_39355828/article/details/117233622 (opens new window)
# 【剑指Offer3】无重复字符的最长子串
# 3. 无重复字符的最长子串 (opens new window)
难度中等5497收藏分享切换为英文接收动态反馈
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
1
2
3
2
3
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
1
2
3
2
3
示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
1
2
3
4
2
3
4
示例 4:
输入: s = ""
输出: 0
1
2
2
# 分析:
窗口模板:使用滑动窗口方法对整个字符串进行遍历,最后输出串口的大小.
窗口进入:使用一个HashSet,不重复则会加入,
窗口出去:重复 就移动窗口左侧,向右滑动
窗口计算:更新窗口的长度
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;
//03给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
public class test030 {
/*public static int lengthOfLongestSubstring(String s)
{
if(s.length()==0)
return 0;
//滑动窗口
HashMap<Character,Integer> map=new HashMap<Character,Integer>();
int max=0;//记录最大的不重复字串的长度
int left=0;//字串左边出现的位置
for(int i=0;i<s.length();i++)
{
if(map.containsKey(s.charAt(i)))//出窗口
left=Math.max(left,map.get(s.charAt(i))+1);//如果出现重复的,则窗口向右滑动
map.put(s.charAt(i),i);//没有重复,则增加元素
max=Math.max(max,i-left+1);
}
return max;
}*/
public static int lengthOfLongestSubstring(String s)//滑动窗口 进 出 算
{
int left=0;
int maxlen=0;
Set<Character> set=new HashSet<>();
for(int i=0;i<s.length();i++)
{
Character c=s.charAt(i);
while (!set.add(c))//进不成功
{ set.remove(s.charAt(left));//开始出
left++;//
}
maxlen=Math.max(maxlen,i-left+1);//判定长度有没有增加,如果left向右移动 则增加了
}
return maxlen;
}
public static void main(String[] args) {
String str="hejjelel";
System.out.println(lengthOfLongestSubstring(str));
}
}
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
编辑 (opens new window)
上次更新: 2026/08/11, 13:36:18