3. Longest Substring Without Repeating Characters

问题

Given a string, find the length of the longest substring without repeating characters.

输入

"abcabcbb"
"bbbbb"
"pwwkew"

输出

the answer is "abc", which the length is 3.
the answer is "b", with the length of 1.
the answer is "wke", with the length of 3. Note that the answer must be a substring, "pwke" is a subsequence and not a substring.

分析

我们可以把字符串拆成n个部分,每个部分都是一个没有重复字符的字符串,而且该字符串是局部最长的,不能再向两边延伸。之后我们就可以统计每部分字符串的长度,求出最长的即可。

举个例子,对于字符串abcabcbb来说,就可以拆成8个部分:abc bca cab abc bc cb b b。最长长度为3。每部分其实都是字符串中每个元素向后延伸,碰到第一个重复字符的结果。

创建一个全局索引表,键为字符,值为该字符的最新下标(由于字符串可能有多个相同字符,所以字符的下标可能有多个)。用一个指针遍历字符串,维护和更新全局状态表和一个非重复字符串的起始值即可。

要点

  • 使用全局索引表保存所有字符的最新下标;
  • 当前字符的最新下标大于当前非重复字符串的起始值时,更新非重复字符串的起始值。

时间复杂度

O(n)

空间复杂度

O(1) (256的数组)

代码

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        vector index(256, -1); // 能够包含所有ascii字符的索引表
        int begin = -1; // 非重复字符串的起始位置
        int maxLen = 0; // 最长非重复字符串的长度
        for (int i = 0; i < s.length(); i++)
        {
            if (index[s[i]] > begin) 
                begin = index[s[i]];
            index[s[i]] = i;
            maxLen = max(maxLen, i - begin);
        }
        return maxLen;
    }
};

你可能感兴趣的:(3. Longest Substring Without Repeating Characters)