题目:
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.
方法一:
用hash表确定字符是否存在
class Solution {
public:
int lengthOfLongestSubstring(string s) {
if (s.empty())
{
return 0;
}
int first = 0, last = 0;//first指向子串开头,last指向子串末尾的下一个位置,last - first正好为length
unordered_set<char> existed;
int maxLen = 0;
while (last < s.length())
{
if (existed.find(s[last]) != existed.end()) //出现过
{
maxLen = max(maxLen, last - first);
//first向后移动,直到跨过与last相同的字符
while (s[first] != s[last])
{
existed.erase(s[first]);//将first跨过的字符从hash表中删除
++first;
}
existed.erase(s[first]);
++first;
}
existed.insert(s[last]);
++last;
}
//last到达字符串的末尾时更新一下maxLen
maxLen = max(maxLen, last - first);
return maxLen;
}
};
方法二:
用hash表保存字符最后一次出现的位置
class Solution {
public:
int lengthOfLongestSubstring(string s) {
if (s.empty())
{
return 0;
}
int location[256] = {-1};//数组中存储的是每个字符最后一次出现的位置
fill_n(location, 256, -1);
int start = 0;//子串的起始位置
int maxLen = 0;
for (int i = 0; i < s.length(); ++i)
{
if (location[s[i]] >= start)//字符s[i]在子串s[start, i - 1]中出现过
{
maxLen = max(maxLen, i - start);
start = location[s[i]] + 1;
}
location[s[i]] = i;
}
return max(maxLen, int(s.length() - start));
}
};