题目
Given a string, find the length of the longest substring without repeating characters.
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
举例
abc 3
bbb 1
pwwkew 3
解题思路
1利用hashmap来降低时间复杂度,建立字符与位置之间的关系
2用滑动窗口维护一个不重复字符串
3通过滑动窗口得到最长子串的长度
代码
class Solution {
public:int lengthOfLongestSubstring(string s) {//维护一个滑动窗口,里面字符无重复int res=0, left = -1, n = s.size();//本题中字符与其位置非常重要,所以预先一个hashmapunordered_map <int,int> m;//定义for (int i = 0; i<n; ++i){if(m.count(s[i]) && m[s[i]]>left)//第一个条件成立,就说明当前字符在之前就一定存在过了//第二个条件说明之前出现过的字符在窗口内{left = m[s[i]];//移除前一个}m[s[i]] = i;//就是构建哈希的步骤res = max(res,i-left);}
return res;}
};
回看笔记/注意点
一. 哈希表是在遍历过程中同时建立起来的,对字符的位置更新随着遍历在更新
字符串:a b c b d
哈希表:a:0 b:1
a:0 b:1 c:2
第四次: 哈希表中存在b说明之前已经存在过了,并且在窗口内,就更新哈希表中b
a:0 b:3 c:2
并且窗口移到第二个b前面
二. 注意边界问题,left算不算在窗口内之类