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.
- 类似贪心算法,两个指针i指向子串的结尾,j指向子串的开始。
- 当发现i指向的下一个字符在子串中出现时,j指向子串中该字符的下一个字符。
class Solution {
public:
int lengthOfLongestSubstring(string s) {
unordered_map<char,int> sub;//sub记录遍历过程中每个字符最后出现的位置
int res=0;
int i=0,j=0; //j记录当前不重复子串的起点,i记录当前不重复子串的终点
while(i<s.size()){ //遍历字符串
if(sub.find(s[i])!=sub.end() && sub[s[i]]>=j ) //如果当前的不重复子串中出现了s[i]
j=sub[s[i]]+1; //更新j
else //如果当前维护的不重复子串中没有出现s[i]
res=max(res,i-j+1); //更新结果,取较大者
sub[s[i]]=i;
i++;
}
return res;
}
};