问题:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
class Solution {
public int lengthOfLongestSubstring(String s) {
//本题采用滑动窗口来解决
//记录左边界
int left = 0;
//记录最大值
int max = 0;
//滑动窗口,用于装字符子串
Map<Character, Integer> map = new HashMap<Character, Integer>();
for(int i = 0; i < s.length(); i ++){
//看是否有重复的部分
if(map.containsKey(s.charAt(i))){
//千万要注意,这里有一个加一
left = 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;
}
}
小结:使用移动窗口法的时间复杂度是O(n),空间复杂度是O(m),这个是跟出现的子串有关的(PS:如果使用暴力求解法,两个for循环遍历头和尾,然后用HashSet来存储,时间复杂度为O(n^3),空间为O(m))