Description
Given a string, find the length of the longest substring without repeating characters.
Example
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.
Discussion
这个问题咋一看最直观的想法就是,当指针p
走到一个新的位置的时候,往前搜索看从子串起始位置startLoc
到p
之间有没有p
位置上的字符。如果有一个位置tmp
和p
上的字符相同的话,就把起始位置startLoc
更改为tmp
。
而这个过程可以优化的地方在于可以用一个数组lastLoc来记录每个字符上一次出现的位置。这样就不用每次都搜索一遍。
算法的时间复杂度为O(n)
。
C++ Code
class Solution {
public:
int lengthOfLongestSubstring(string s) {
vector<int> lastLoc(256, -1);
int startLoc = -1;
int maxLen = 0;
for(int i = 0; i < s.length(); i++)
{
if(lastLoc[s[i]] > startLoc)
{
startLoc = lastLoc[s[i]];
}
lastLoc[s[i]] = i;
if(i - startLoc > maxLen)
{
maxLen = i - startLoc;
}
}
return maxLen;
}
};