无重复的数据结构--HashSet
特殊的数据结构HashSet
HashSet实现了Set接口,无序,是由HashMap实现的元素不可重复的集合。
运用HashSet
这里引入力扣的3.无重复字符的最长子串,HashSet在此题中完美地运用上了。
原题要找出无重复字符的最长子串,记录其长度并返回。
- 对于解法,我的认识是用到了HashSet的contains,由于StringBuffer没有contains方法,只有indexOf,我第一次运用时只能解决所给出的基本实例,但遇到“aab”/" "却解不出。由此陷入了消去空格的误区。
- 对于官方解答,我的心得是,数据结构用得好啊!而且对于其基本操作要了解,此题只用到add()、remove()和contains()方法,但其方法还有clear() 和size()。
- 官方思路是:双指针法。先用左指针i遍历字符串的长度,然后在每个i的循环下对右指针j向右移动,只要j < n 和当前j没出现过,把当前元素放进set集合中,并且j++。在找到重复字符或者直接遍历到n后,用ans进行保存长度,i向右移动一位,在之后的循环都remove掉s【i - 1】下标的元素,然后继续查找。
这里附上Java解法
public int lengthOfLongestSubstring(String s){
int ans = 0;
int j = 0,n = s.length();
Set<Character> set = new HashSet<Character>();
for(int i = 0;i < n;++i){
if(i != 0){
set.remove(s.charAt(i - 1));
}
while(j < n && !set.contains(s.charAt(j)){
set.add(s.charAt(j));
++j;
}
ans = Math.max(ans, j - i);
}
return ans;
}