利用HashSet解决无重复字符的最长子串问题

利用HashSet解决无重复字符的最长字串问题

HashSet是基于HashMap来实现的,是一个不允许有重复元素的集合,但是HashSet允许有空值。另外HashSet是无序的,即不会记录插入的顺序。在线程安全方面,它也不是线程安全的,如果多个线程尝试同时修改HashSet,则最终的结果是不正确的。在多线程访问时,必须显式同步对HashSet的并发访问。

HashSet位于java.util包中,使用前需要引入它:

import java.util.HashSet;//引入HashSet类

下面我们利用java中的HashSet解决无重复字符的最长字串问题:

public int lengthOfLongestSubstring(String s){
    //哈希集合,记录每个字符是否出现过
    Set<Character> occ = new HashSet<Character>();
    int n = s.length();
    //rk:右指针,初始值为-1,相当于我们在字符串的 左边界的左侧,还没有开始移动
    //ans:记录字串长度
    int rk = -1; ans = 0;
    for (int i = 0; i < n; i++){
        if(i != 0){
            //左指针移动一格,移除一个字符
            //这里不太容易理解:其实就是左指针一次递增,直至把重复字符之前的元素全部删除掉
            occ.remove(s.charAt(i - 1));
        }
        while(rk + 1 < n && !occ.contains(s.charAt(rk + 1))){

            //不断的移动右指针
            occ.add(s.charAt(rk + 1));
            ++rk;
        }
        //此时,第i到rk个字符是一个极长的无重复字符串
        ans = Math.max(ans, rk -i + 1);
    }
    return ans;
}

例如:

输入: "abcabcbb"

输出: 3

解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

猜你喜欢

转载自blog.csdn.net/li_w_ch/article/details/108366112