题目
Given a string, find the length of the longest substring without repeating characters.
Examples:
Given "abcabcbb"
, the answer is "abc"
, which the length is 3.
Given "bbbbb"
, the answer is "b"
, with the length of 1.
Given "pwwkew"
, 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.
分析
用start记录当前子串的开头,max记录到目前为止所出现的最长不重复子串的长度。
声明一个数组loca记录每个到目前为止每个字符出现的最后位置
遍历整个字符串,
若当前字符在当前子串中出现过,则将start赋值为当前字符出现的位置+1,
更新当前字符出现的位置,
如果当前子串的长度比max大,则更新max。
该算法复杂度为O(n)
代码
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int n = s.size();
int start = -1,max = 0;
vector<int> loca(256,-1);
for (int i = 0;i < n;i++)
{
if (loca[s[i]] > start)
start = loca[s[i]];
if (i - start > max)
max = i - start;
loca[s[i]] = i;
}
return max;
}
};