无重复子串
今天在刷这个无重复字串的时候,我感受到了leetcode
深深的恶意,也让我明白了就是千万不能看例子来思考思路 先看下题目
看到题目的第一刻,我甚至有点想笑,感觉今天已经温了,游戏已经可以先排好队了,但是leetcode
给了我一记迎头痛击,我第一版是这样的
/**
* @param {string} s
* @return {number}
*/
var lengthOfLongestSubstring = function (s) {
var count =0;
var max = 0;
var subString = '';
while(count < s.length){
// 如果字符没有在预定字串中出现过就添加 只要有一次 不相同就结束
if(subString.indexOf(s.charAt(count)) == -1){
subString += s.charAt(count);
}else{
(max < subString.length)?max = subString.length:null;
subString = s.charAt(count);
}
count++;
}
return max;
};
大致思路就是循环从开始时,将字符存入字串中,然后如果找到不存的,就清空字串记录下max值,然后继续记录字串一直无重复到最终,我还是太傻太天真,leetcode
780多个测试用例我在20多个就趴下了,他给了一个串dvdf
,我靠我看到这个串的时候,不仅把游戏排队取消了,甚至还泡了杯枸杞,这一来就太难了,其实在内个时候也有别的选择,就是我在while中来一个for循环,美滋滋 但是毕竟是刷算法题 要老是这样其实我还不如不刷
所以我打算继续埋头苦干
,终于在经历了半个小时的挣扎后,我在无意中想起了在网络课程中的一个东西叫做滑动窗口 其实网络中的滑动窗口本来跟这个没什么关系,但是我当时为了搞懂滑动窗口,去研究了下滑动窗口的算法
概念:
滑动窗口算法可以用以解决数组/字符串的子元素问题,它可以将嵌套的循环问题,转换为单循环问题,降低时间复杂度。
原文地址 : https://www.zhihu.com/topic/20746237/intro
还是推荐去看下这是知乎的一个话题,里面有很多精彩的对答,然后回到正题其实所谓的滑动窗口算法,就是有一个值在字符串之类的数据中滑动~,所以我就直接上干货了
/**
* @param {string} s
* @return {number}
*/
var lengthOfLongestSubstring = function (s) {
var map = new Map();
var count = 0;
// 表示当前字串的开始位置下标
var start = 0;
var max = 0;
while (count < s.length){
var char = s.charAt(count);
// map key存字符 value存上次出现的索引
if (map.has(char) && map.get(char) >= start) {
start = map.get(char) + 1;
map.set(char, count);
} else {
map.set(char, count);
var cul = count - start+1;
max = Math.max(max, cul);
}
count++;
}
return max;
};
整体思路稍微说一下就是滑动变量 start
表示无重复字串的起始位置,通过map中的重复key检查 如果重复并且字符的上一个位置(map中的值)大于当前子串的start
索引值 那就说明stary需要移动了,然后max判断 遍历时的索引值,减去内个字串的起 始位置索引值,再加上索引与长度差的1 就是最大长度,如果想了解但看不明白 浏览器随便打断点看一下就ok
这个成绩 可能也是我目前最好的成绩了 但是今天占用的时间实在是有点多 继续加油吧