3. 无重复字符的最长子串

原题链接

3. 无重复字符的最长子串

解题思路

  • 在谈及重复问题,大概率会使用 hashmap 或者 hashset
  • 最长子串,因为是连续的,所以有点想使用滑动窗口的方法

滑动窗口

在 HashMap 中维护一个表,这个表的作用:

  • 记录每个字符最后一次出现的位置索引
  • HashMap 天然是无重复的

以abcba举例,在检索到abc的时候,在hashmap中存入,a-0,b-1,c-2。

当检索到3位置的b时,发现已经重复,所以直接放弃原来的b,滑动窗口的头,从b以前位置的下一个位置开始。

同时将b-1更新为b-3,其中还有些小问题要注意:

  • 要用一个变量去记录最大长度
  • 以上面的为例,当我检测到a的时候,虽然a在hashmap中已经存在,但它其实已经不在滑动窗口的范围了,其实说明a在上一步,遇到b的时候,就已经被抛弃了。
import java.util.HashMap;

public class N3 {
    public static void main(String[] args) {
        String s = "abcabcbb";
        System.out.println(lengthOfLongestSubstring(s));
    }

    public static int lengthOfLongestSubstring(String s) {
        int left = 0;
        int max_len = 0;
        HashMap<Character, Integer> map = new HashMap<>();
        for (int i = 0; i < s.length(); i++) {
            if(map.containsKey(s.charAt(i)))
                left = Math.max(left, map.get(s.charAt(i))+1);
            map.put(s.charAt(i), i);
            max_len = Math.max(max_len, i-left+1);
        }
        return max_len;
    }
}

posted @ 2020-03-23 11:25  土堆碎念  阅读(125)  评论(0编辑  收藏  举报