无重复的数据结构--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;
}

原题

posted @ 2020-11-14 00:08  acchris  阅读(531)  评论(0)    收藏  举报