LeetCode_3 无重复字符的最长字串
LeetCode_3 无重复字符的最长字串
题目要求
给定一个字符串
s
,请你找出其中不含有重复字符的 最长子串
** **的长度。
示例 1:
输入: s = “abcabcbb” 输出: 3
解释: 因为无重复字符的最长子串是“abc”
,所以其长度为 3。示例 2:
输入: s = “bbbbb” 输出: 1 解释:
因为无重复字符的最长子串是“b”
,所以其长度为 1。示例 3:
输入: s = “pwwkew” 输出: 3 解释:
因为无重复字符的最长子串是“wke”
,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke”
是一个子序列,不是子串。提示:
0 <= s.length <= 5 * 10<sup>4</sup>
s
由英文字母、数字、符号和空格组成
代码及解析
class Solution {
public:int lengthOfLongestSubstring(string s) {// 使用哈希表存储字符及其最后出现的位置map<char, int> charMap;// 初始化慢指针和快指针,分别指向字符串的开始位置int slow = 0;int fast = 0;// 初始化最大子字符串长度为0int maxLength = 0;// 使用快慢指针法遍历字符串while(fast < s.length()){// 查找当前字符在哈希表中的位置auto lastPos = charMap.find(s[fast]);// 如果当前字符已经出现过,且其最后出现的位置在慢指针的右边if (lastPos != charMap.end() && lastPos->second >= slow){// 将慢指针移动到当前字符的下一个位置slow = lastPos->second + 1;}// 计算当前子字符串的长度int currentLength = fast - slow + 1;// 更新最大子字符串长度maxLength = maxLength > currentLength ? maxLength : currentLength;// 更新当前字符在哈希表中的位置charMap[s[fast]]= fast;// 快指针向前移动fast ++;}// 返回最大子字符串长度return maxLength;}
};
方法和思想
- 哈希表:使用哈希表存储字符及其最后出现的位置,用于快速查找字符是否已经出现过,以及其最后出现的位置。
- 滑动窗口:通过调整慢指针和快指针的位置来找到最长的不含重复字符的子字符串。当遇到重复字符时,慢指针向前移动到重复字符的下一个位置,以此来缩小窗口的大小。
时间复杂度
- 时间复杂度:O(n),其中 n 是字符串的长度。因为每个字符最多被访问两次,一次是快指针扫描,一次是慢指针缩小窗口。
空间复杂度
- 空间复杂度:O(min(n, m)),其中 n 是字符串的长度,m 是字符集的大小。因为哈希表最多存储 n 个字符,但如果字符集的大小有限(例如 ASCII 字符集),那么空间复杂度可以视为 O(m)。