题目:给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
使用滑动窗口:
滑动窗口不断向前,当前元素不在set中 就加入set 然后更新最大长度,i++继续下一轮循环,set中有重复元素不断让j++ 并删除窗口之外的元素 直到滑动窗口内没有重复的元素
复杂度:时间复杂度O(n),n是字符串的长度。空间复杂度是O(n),即set的空间,最差的情况是O(n)
public int lengthOfLongestSubstring(String s) {
Set<Character> set = new HashSet<Character>();
int n = s.length();
int j = -1, ans = 0;
for (int i = 0; i < n; ++i) {
if (i != 0) {
set.remove(s.charAt(i - 1));
}
while (j + 1 < n && !set.contains(s.charAt(j + 1))) {
set.add(s.charAt(j + 1));
++j;
}
ans = Math.max(ans, j - i + 1);
}
return ans;
}
map中的containsKey(key)方法是判断该key在map中是否有key存在。如果存在则返回true。如果不存在则返回false。