无重复字符的最长子串

in 知识共享 with 0 comment

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/longest-substring-without-repeating-characters
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

给定一个字符串 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^4
s 由英文字母、数字、符号和空格组成

本人提交代码

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        if ( s.length() <= 1 )
            return s.length();

        int maxLen = 0;
        // all possible characters
        int charMap[256] = { 0 };
        int startIndex = 0;
        for ( unsigned int i = 0; i < s.length(); i++ )
        {
            // if not appeared
            if ( charMap[s[i]] == 0 )
            {
                charMap[s[i]]++;
                if ( maxLen < i - startIndex + 1 )
                    maxLen = i - startIndex + 1;
            }
            else
            {
                // appeared, find the very first 'index' to start a new substring
                charMap[s[i]]++;
                while( startIndex < i )
                {
                    if ( s[startIndex] == s[i] )
                    {
                        charMap[s[startIndex]]--;
                        startIndex++;
                        break;
                    }
                    else
                    {
                        charMap[s[startIndex]]--;
                    }
                    startIndex++;
                }

                // Special case, "aaaaaaa"
                while( s[startIndex] == s[startIndex + 1] && (startIndex + 1 <= i) )
                    startIndex++;
            }
        }

        return maxLen;
    }
};
Responses