终于搞明白Java双指针了,前段时间有事情,所以有几天没进行算法的打卡,今天终于回归正常啦,继续进入滑动窗口的学习。
问题:
知识点:
1、滑动窗口:
滑动窗口,就是通过一个非固定的窗口移动,找到答案,例如本题示例1中,abcabcbb,在窗口中的先是abc,然后a进入窗口,变为abca,但是不满足条件,然后滑动窗口。
2、HashMap
用HashMap,记录窗口中每个字母的情况
HashMap<Character, Integer> hs = new HashMap<Character, Integer>();
3、String、char类型的相关操作
用charAt() 方法用于返回指定索引处的字符
String s = "aabbc";
char result = s.charAt(0);
思路:
老规矩,1代表左指针,2代表右指针,-->代表移动,右指针每次都+1,左指针,根据情况看是否要向右移动。
a | b | c | a | b | c | b | b | ||
1,2 | |||||||||
1 | 2 | ||||||||
1 | 2 | ||||||||
1--> | 1 | 2 | |||||||
1--> | 1 | 2 | |||||||
1 | 2 | ||||||||
1--> | 1 | 2 | |||||||
1--> | 2 1 |
代码:
class Solution {
public int lengthOfLongestSubstring(String s) {
HashMap<Character,Integer> hs = new HashMap<Character,Integer>();
if(s.equals("")){
return 0;
}else{
int left = 0;
int right = 0;
int n = 1;
hs.put(s.charAt(right),right);
while(right < s.length()-1){
right++;
if( hs.containsKey(s.charAt(right)) == false){
hs.put(s.charAt(right),right);
}else if(hs.get(s.charAt(right)) >= left){
left = hs.get(s.charAt(right))+1;
hs.remove(s.charAt(right));
hs.put(s.charAt(right),right);
}else if(hs.get(s.charAt(right)) < left) {
hs.remove(s.charAt(right));
hs.put(s.charAt(right),right);
}
n = Math.max(n,right-left+1);
}
return n;
}
}
}