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);
    }
};
comments powered by Disqus