【LeetCode03】

94 阅读1分钟

总结一下Leetcode.3的收获:

学习到了HashSet<>结构

HashSet结构有和HashMap类似的contains()(HashMap:containsKey(),containsValue()),add()(HashMap:put())方法,同样有O(1)的查找时间,所以暴力查找是否含有某个值时不需要O(n^2)的复杂度。

po一下代码:

public static int lengthOfLongestSubstring(String s){
    HashSet<Character> hset = new HashSet<>();
    int maxlen = 0;
    int i =0, j = 0;
    int n = s.length();
    while(i<n && j< n){
        if(!hset.contains(s.charAt(j))){
            hset.add(s.charAt(j++));
            maxlen = Math.max(maxlen,j-i);
        }
        else{
            hset.remove(s.charAt(i++));
        }
    }
    return maxlen;
}

另外就是一句代码的两个操作,如:

hset.add(s.charAt(j++));

省去了另写一句更改指针的麻烦。

目前写代码的问题:

代码不够简洁,思路不够清晰,逻辑不够严谨。

本题中的思路很清楚:

循环,通过一个while和两个指针遍历字符串,每当快指针j指向的字符不在hashset中时就添加进入hashset并更新快指针j、更新最大长度(即使当前长度不比maxlen大也没有关系)。

反之,如果hashset已有当前字符,直接从hashset中删除,注意这里的循环并不是符合第一直觉的,但是确实简洁和可行的。