1 题目
Given a string,find the length of the longest substring without repeating characters. Forexample, the longest substring without repeating letters for"abcabcbb" is "abc", which the length is 3. For"bbbbb" the longest substring is "b", with the length of 1.
2 分析
思路一:最简单直接的方法是从字符串的每个字符w出发检测出最长无重复子串的长度,最后取最大值。时间复杂度O(nAve(subStr)),其中n为字符串长度,Ave(subStr)表示从所有位置出发最大子串的长度。
思路二:例如字符串s = “abcdcf”,从字符串的0位置出发,在4时遇到重复字符”c”,按照思路一下一步从位置1出发开始计算。不难发现,从位置1、2出发的子串长度不会大于从0位置出发的子串长度,因此不需要计算从位置1、2出发的最长子串,只需从位置3开始。从位置3开始时,只需回撤位置0、1、2的标志位即可,无需真正从位置3开始。综上字符串每个位置的元素访问2次,因此时间复杂度O(n)。
3 实现
思路二的代码实现如下:
intSolution::lengthOfLongestSubstring(string s) { int maxLen = 0; int len = 0; int start = 0; int isFirst[128] = {-1}; for (int i = 0; i < 128; ++i) { isFirst[i] = -1; } int cur = 0; int size = s.length(); char ch; while (cur < size) { ch = s[cur]; if (isFirst[ch] > -1) { int temp = isFirst[ch]; maxLen = max(maxLen, len); len = len - (temp - start +1); while (start <= temp) { isFirst[s[start++]] =-1; } } isFirst[ch] = cur; ++len; ++cur; } maxLen = max(maxLen, len); return maxLen; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-09 14:24:35