LeetCode-3
1、题解一:滑动窗口解法
1.1、什么是滑动窗口
其实就是一个队列,比如例题中的 abcabcbb,进入这个队列(窗口)为 abc 满足题目要求,当再进入 a,队列变成了 abca,这时候不满足要求。所以,我们要移动这个队列!
1.2如何移动?
我们只要把队列的左边的元素移出就行了,直到满足题目要求!
一直维持这样的队列,找出队列出现最长的长度时候,求出解!
public static int lengthOfLongestSubstring(String s) {
int len = s.length();
int max = 0;
int left = 0;
Map<Character,Integer> map = new HashMap<>();
for (int i = 0; i < len; i++) {
if (map.containsKey(s.charAt(i))){
left = Math.max(left,map.get(s.charAt(i))+1);
//left = map.get(s.charAt(i))+1;
}
map.put(s.charAt(i),i);
max = max > i - left + 1 ? max : i - left + 1;
}
return max;
}
1.3代码解析
用这个公式 left = Math.max(left,map.get(s.charAt(i))+1);而不用 left = map.get(s.charAt(i))+1;
原因:当输入样例如 abba 时,自己模拟一遍即可深入体会。
2、题解二:暴力查询
解题思路:依次从每一个位置作为开始位置,求出无重复字符最长字串的长度,取最大值即可。
public int lengthOfLongestSubstring(String s) {
int len = s.length();
int max = 0;
if(len == 0 || len ==1){
return len;
}
for (int i = 0; i < len; i++) {
List<Character> list = new ArrayList<>();
for (int j = i; j < len; j++) {
if (!list.contains(s.charAt(j))){
list.add(s.charAt(j));
max = max > j - i + 1 ? max : j - i + 1;
}else {
break;
}
}
}
return max;
}