LeetCode第3题:无重复字符串的最长子串

93 阅读1分钟

题目地址

明确题意:

给一个字符串,返回该字符串不含重复字符的最长子串的长度。

  • 不含重复字符:子串内不能有相同的字符。
  • 子串:字符是连续的。

解题思路:

方式一:暴力求解

  • 逐个生成子字符串
  • 看它是否不含有重复的字符

方式二:滑动窗口

什么是滑动窗口?参考下图

image.png i表示左指针,j表示右指针。不断移动右指针,将右指针指向的字符不断加入窗口,直至窗口遇到重复字符。就调整左指针。子串的长度就是j-i+1,所以滑动窗口可以用队列来实现,也可以用其他数据结构来实现。

public int lengthOfLongestSubstring(String s) {
    //判空
    if (s == null || s.length() == 0) {
        return 0;
    }
    //哈希集合,记录每个字符是否出现过
    Set<Character> occ = new HashSet<Character>();
    int n = s.length();
    //右指针,初始值为-1,相当于在字符串的左侧,还未开始移动
    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;
}