一.代碼及註釋spa
class Solution { public: int lengthOfLongestSubstring(string s) { int n = s.size(); //字符串的長度 int ans = 0; //最長無重複子串的長度 //創建map表 key爲字符 val爲該字符的下一個座標位置 //val取符號座標+1用於更新start unordered_map<char,int> m; //定義start和end end即爲當前字符,不斷+1 for(int start=0,end=0;end<n;end++){ //當前字符爲c char c = s[end]; //若是map中有當前字符(即出現了重複的字符),則進入if語句 if(m.find(c)!=m.end()){ /* 兩種狀況: 1.若是start比m[c]小,如pwwkew,start爲2,end爲5兩個w相等 則start就更新爲3,以end爲結尾的最長無重複子串才能是5-3+1=3; 2.若是start比m[c]大,如kwawk,如圖所示,start爲2,end爲5,須要 start保持不變 */ start = max(m[c],start); } //ans更新,end-start+1即以當前end爲結尾的最長無重複串 ans = max(ans,end-start+1); //添加數據 m.erase(c); m.insert(make_pair(c,end+1)); } return ans; } };
二.圖解code
三.須要map的知識點(經常使用總結)blog
map的插入:經常須要和刪除配合使用字符串
map.erase(key);string
map.insert(make_pair(key,val));it
map的訪問:直接經過訪問下標io
m[下標];class
map的循環:awk
auto iter = m.begin();循環
while(iter!=m.end()){
cout<<iter.first()<<endl; //輸出key
cout<<iter.second()<<endl;//輸出val
}
map的查找:
m.find(key);返回的是迭代器,可用m.find(key)!=m.end()判斷是否存在該key。
m.count(key);返回迭代器的數量,用於可重複的map。