3. 无重复字符的最长子串
数据量太大,显然不能用n方的算法
又只是子串,遍历一遍即可
遇到一个重复的字母,只有两个操作
1、以此字母为间隔,将下一个字母作为起点
2、从上一个此字母(就是重复字母)的下一个字母开始,到此字母连起来
显然,第2个操作带来的价值最大
因此需要记录起点
注意一点,如果一个字母重复了,但重复字母在起点之前,那是不用管的
class Solution { public: map<char, int> vis; int lengthOfLongestSubstring(string s) { int length = s.length(); int ret = 0, temp = 0, ss = 1; for(int i = 0; i < length; i++) { if(vis[s[i]] >= ss) { ret = max(ret, temp); temp = i + 1 - vis[s[i]]; ss = vis[s[i]] + 1; vis[s[i]] = i + 1; } else temp++, vis[s[i]] = i + 1; } ret = max(ret, temp); return ret; } };