跳转至

3. 无重复字符的最长子串

难度:中等

题目

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

示例 1:

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

示例 2:

输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

示例 3:

输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
     请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

示例 4:

输入: s = ""
输出: 0

提示:

  • 0 <= s.length <= 5 * 104
  • s 由英文字母、数字、符号和空格组成

题解

基本思路 :用一个数组存储各字母出现的次数(哈希表)。当不存在重复字母时滑动窗口不断向右延伸,直到出现重复字母或到达字符串结尾。检测到重复字母后,从左向右收缩滑动窗口,每次收缩都对哈希表进行更新。直到不存在重复字母时,滑动窗口才停止收缩,继续向右延伸。

时间复杂度\(O(N)\)

空间复杂度\(O(1)\),与字符串长度无关,但与单个字符的宽度有关。

int lengthOfLongestSubstring(char * s){
    int length = 0, ret = 0;
    char hashMap[256] = {0}, *cur = s;
    while(*cur)
    {
        while(hashMap[*cur])
        {
            hashMap[*(cur - length)] -= 1;
            length--;
        }
        hashMap[*cur] = 1;
        length++;
        ret = ret > length ? ret : length;
        cur++;
    }
    return ret;
}

Reference

评论