LeetCode 03 最长不重复字串

输入: "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
int lengthOfLongestSubstring(string s) 
{
	int res = 0, left = 0, n = s.size();
	unordered_map<int, int> m;
	for (int i = 0; i < n; ++i) {
		if (m.count(s[i])) {
			left = m[s[i]];
		}
		m[s[i]] = i;
		res = max(res, i - left);
	}
	return res;
}

  

  解题思路:

使用滑动窗口法, i为右边界, left为左边界的前一个

使用i-left就可以求出长度. 如果字符串为空, i=0, 那么长度就是1; 这也是为什么把left设为-1的原因;

使用hashmap 保存每个数和其下标的映射,

如果s[i]已经出现过了, 那么map[s[i]]就大于零

那么此时有两种情况:

1. 上次出现的位置在left的左边, 既不在left和i的区间内

  这种情况下, 需要将当前字符包含在区间内, 然后更新下坐标,进行下次循环

2. 上次出现的位置在left的右边, 即在区间内

  此时将left 指针直接移到上次出现该字符的位置, 才能满足不重复的要求.

最后, 每次判断一个字符, 就更新下 i-left和当前最长长度.

  

原文地址:https://www.cnblogs.com/derek-dhw/p/10478289.html