链接:无重复最长字串
步骤:
定义两个指针i
,j
表示当前扫描到的字串是[i,j]
(闭区间)扫描过程中维护一个哈希表unordered_map<char,int> hash
表示[i, j]
中每个字符出现的次数、
- 指针j 向后移动一位,同时将哈希表中
s[j]
的次数 +1hash[s[j]] ++
- 假设
j
移动的当前区间[i, j]
中没有重复字串, 一旦j
移动后那么只有s[j]
出现了2次,不断移动i
直到区间中s[j]
的个数等于1为止。
时间复杂度:O(n)
int lengthOfLongestSubstring(string s) {
unordered_map<char, int> hash;
int res = 0;
for (int i = 0, j = 0; j < s.size(); j ++) {
hash[s[j]] ++;
while(hash[s[j]] > 1) hash[s[i ++]] --;
res = max(res, j - i + 1);
}
return res;
}
按照这种思路写出js代码如下
var lengthOfLongestSubstring = function(s) {
let map = new Map(), res = 0;
for (let i = 0, j = 0; j < s.length; j ++) {
if (map.has(s[j])) {
i = Math.max(map.get(s[j]) + 1, i);
}
map.set(s[j], j);
res = Math.max(res, j - i + 1);
}
return res;
};
方法二:
充分利用splice方法 传入两个参数,表示删除数组中元素的开始坐标与删除的数量splice(0,2)
从下标位0开始 删除两个数
- 使用
IndexOf()
判断当前字符有没有在数组中arr
中出现过,
如果出现过:从开头到当前字符串全部删掉 - 在窗口右边放入新的字符
- 更新最大值
res = Math.max(res, arr.length)
var lengthOfLongestSubstring = function(s) {
let arr = [], res = 0;
for (let i = 0; i < s.length; i ++) {
let index = arr.indexOf(s[i]);
if (index !== -1) {
arr.splice(0, index + 1);
}
arr.push(s[i]);
res = Math.max(res, arr.length);
}
return res;
};