题目:
Given a string, find the length of the longest substring without repeating characters.
给出一个字符串,找出无重复字符的最长子串(英语渣渣)
Example 1:
Input: "abcabcbb"
Output: 3
Explanation: The answer is "abc", with the length of 3.
Example 2:
Input: "bbbbb"
Output: 1
Explanation: The answer is "b", with the length of 1.
Example 3:
Input: "pwwkew"
Output: 3
Explanation: The answer is "wke", with the length of 3.
Note that the answer must be a substring, "pwke" is a subsequence and not a substring.
分析:
通过 ”pwkefaw“ 此字符串来分析
记录最长子串,题目给我们的提示是通过两个指针和map的数据结构来实现,两个指针分别定义为i、j;
1.首先遍历字符串,将字符加入到hashmap中;
2.如果hashmap中不存在当前字符,则将它放入hashmap中,继续循环;
3.当循环至 i = 5 时,无重复字符,当前最大长度为 i + 1 = 6(为什么加一?因为i是数组下标,从0开始,所以要加一才是子串长度)
4.如果hashmap中存在当前字符,通过慢指针j(为什么是慢指针?因为j的移动会比i慢,如果整个字符串没有重复的字符,那么j不会移动)记录上一次出现的位置;
5.当循环到 i = 6 时,发现hashmap中存在 ’w‘ 字符,取出之前的位置赋值给指针 j = map.get(char) + 1 = 2(j记录的是实际位置,从1开始);
6.然后更新hashmap中当前字符为新的位置6
7.计算从第三个字符k到新出现的w位置的长度 i - j + 1 ;
8,和之前的长度做比较,保留大的值
代码:
public int lengthOfLongestSubstring(String s) {
Map<Character, Integer> map = new HashMap<>();
int max = 0;
for (int i = 0, j = 0; i < s.length(); i++) {
if (map.containsKey(s.charAt(i))) {
j = Math.max(j, map.get(s.charAt(i)) + 1);
}
map.put(s.charAt(i), i);
max = Math.max(max, i - j + 1);
}
return max;
}
时间复杂度为O(n)
空间复杂度为O(n)