48. 最长不含重复字符的子字符串
1. 描述
请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。
2. 例子
示例 1:
输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
3. 限制
- s.length <= 40000
4. 题解
m = i_letters.size(), n 是 i_letters 中出现的不同字符个数
时间复杂度: O(m)
空间复杂度: O(n),由于整个字符集也不过 128 或 256 等,可以视为 O(1)
class Solution
{
public:
// int lengthOfLongestSubstring(string s)
int lengthOfLongestSubstring(string &i_letters)
{
int maxLength = 0, beginningIndex = 0;
unordered_map<char, int> letterLastIndex;
for(int i = 0; i < i_letters.size(); i++)
{
char letter = i_letters[i];
if(letterLastIndex.find(letter) != letterLastIndex.end() && letterLastIndex[letter] >= beginningIndex)
{
maxLength = max(maxLength, i - beginningIndex);
beginningIndex = letterLastIndex[letter] + 1;
}
letterLastIndex[letter] = i;
}
return max(maxLength, (int)i_letters.size() - beginningIndex);
}
};