滑动窗口求无重复最长子串
java实现,以求无重复最长子串的题目为例
题目
例如输入: s = “abcabcd”
因为无重复字符的最长子串是 “abcd”,所以其长度为 4。
滑动窗口
理解为一个可以移动的窗口,窗口中的值都是符合要求的(以该题为例,即窗口中字符不重复)
代码实现
class Solution {
public int lengthOfLongestSubstring(String s) {
if (s.length()==0) return 0;
HashMap<Character, Integer> map = new HashMap<Character, Integer>();
int max = 0;//记录最长字符串的值
int label = 0;//滑动窗口的下标起点,i为窗口终点
for(int i = 0; i < s.length(); i ++){
if(map.containsKey(s.charAt(i))){//判断有无重复字符
label = Math.max(label,map.get(s.charAt(i)) + 1);//出现相同的字符时,修改滑动窗口起点(相当于开启一个新的滑动窗口进行记录)
}
map.put(s.charAt(i),i);//每个字符都加到map,值为其下标
max = Math.max(max,i-left + 1);//比较当前最大值与当前滑动窗口的长度
}
return max;
}
}
复杂度
时间复杂度:O(N),一个for循环,哈希的运算当做O(1)