一.代码及注释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。