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;
}