题目链接

无重复字符的最长子串

题目描述

image.png

解题思路

方法一:滑动窗口

将结果可以看成是一个动态扩容的窗口,窗口的初始大小为1,然后每次遍历找到当前最长无重复串,找到相同的字符时则停止,然后再进行下一个字符的遍历,在遍历之前将滑动窗口直接往后移动一格;

正常来说,是要找到上一次遍历相同的字符对应的位置,然后移动相应的步数,不过这会导致又加了一轮遍历,所以就直接每次遍历移动一格

举例说明:
image.png

实现代码:

  1. class Solution {
  2. public int lengthOfLongestSubstring(String s) {
  3. int len = s.length();
  4. if(len < 2) {
  5. return len;
  6. }
  7. Set<Character> container = new HashSet<Character>();
  8. int size = -1;
  9. int ans = 0;
  10. for(int i=0; i<len; i++) {
  11. if(i != 0) {
  12. container.remove(s.charAt(i-1));
  13. }
  14. while (size + 1 < len && !container.contains(s.charAt(size+1))) {
  15. container.add(s.charAt(++size));
  16. }
  17. ans = Math.max(ans, size - i + 1);
  18. }
  19. return ans;
  20. }
  21. }