題目
題解
class Solution {
public:
int lengthOfLongestSubstring(string s) {
unordered_map<char,int>mp;
int start=0;
int maxlength=0;
for(int i=0;i<s.size();i++){
if(mp.find(s[i])!=mp.end()&&mp[s[i]]>=start){
start=mp[s[i]]+1;
}
mp[s[i]]=i;
maxlength=max(maxlength,i-start+1);
}
return maxlength;
}
};
-
用一個窗口維持當前不重複的子串
-
用
unordered_map<char, int>存每個字符出現的最新位置 -
如果當前字符已出現,滑動窗口左邊界
start往右移,移到重複字符的下一位 -
實時更新最長子串長度
maxLength
| i | s[i] | start | map | 長度(i-start+1) | maxLength |
|---|---|---|---|---|---|
| 0 | a | 0 | a:0 | 1 | 1 |
| 1 | b | 0 | a:0, b:1 | 2 | 2 |
| 2 | c | 0 | a:0, b:1, c:2 | 3 | 3 |
| 3 | a | 0→1 | a:3,... | 3 | 3 |
| 4 | b | 1→2 | b:4,... | 3 | 3 |
| 5 | c | 2→3 | c:5,... | 3 | 3 |
| 6 | b | 3→5 | b:6,... | 2 | 3 |
| 7 | b | 5→7 | b:7 | 1 | 3 |