总结一下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中删除,注意这里的循环并不是符合第一直觉的,但是确实简洁和可行的。