题目: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.
Subscribe to see which companies asked this question.
class Solution {
public:
int lengthOfLongestSubstring(string s) {
}
};
解题思路:
具体见参考算法,这个算法会让你眼前一亮
参考算法如下:
int lengthOfLongestSubstring(string s) {
vector<int> dict(256, -1);//ascii共占8位二进制数,共256个字符编码,其中包括a~z
int maxLen = 0, start = -1;
for (int i = 0; i != s.length(); i++) {
if (dict[s[i]] > start)
start = dict[s[i]];//发现和前面重复的字母,并改变start标志
dict[s[i]] = i;
maxLen = max(maxLen, i - start);
}
return maxLen;
}
法二:
int lengthOfLongestSubstring( std::string s )
{
int MaxLength = 0;
auto left = s.begin();
std::unordered_map<char, std::string::iterator> m;
for ( auto p = s.begin(); p != s.end(); ++p )
{
left = m.find( *p ) == m.end() ? left : std::max( left, std::next( m.find( *p )->second ) );
MaxLength = std::max( MaxLength, (int) std::distance( left, std::next( p ) ) );
m[*p] = p;
}
return MaxLength;
}