3. 无重复字符的最长子串
原题链接
3. 无重复字符的最长子串
解题思路
- 在谈及重复问题,大概率会使用 hashmap 或者 hashset
- 最长子串,因为是连续的,所以有点想使用滑动窗口的方法
滑动窗口
在 HashMap 中维护一个表,这个表的作用:
- 记录每个字符最后一次出现的位置索引
- HashMap 天然是无重复的
以abcba举例,在检索到abc的时候,在hashmap中存入,a-0,b-1,c-2。
当检索到3位置的b时,发现已经重复,所以直接放弃原来的b,滑动窗口的头,从b以前位置的下一个位置开始。
同时将b-1更新为b-3,其中还有些小问题要注意:
- 要用一个变量去记录最大长度
- 以上面的为例,当我检测到a的时候,虽然a在hashmap中已经存在,但它其实已经不在滑动窗口的范围了,其实说明a在上一步,遇到b的时候,就已经被抛弃了。
import java.util.HashMap;
public class N3 {
public static void main(String[] args) {
String s = "abcabcbb";
System.out.println(lengthOfLongestSubstring(s));
}
public static int lengthOfLongestSubstring(String s) {
int left = 0;
int max_len = 0;
HashMap<Character, Integer> map = new HashMap<>();
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_len = Math.max(max_len, i-left+1);
}
return max_len;
}
}