天天看点

Javascript算法:非固定宽度滑动窗口算法

应用:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

思想:在一个字符串中,有两个标记left和right。right由0移动到字符串最后一位,每次移动一位。每次移动,判断新增加的一位在之前的字符串中是否存在,如果不存在,继续移动,如果存在,移动left至新增加的right位在之前字符串中的位置的下一位。

举例:

在下图中,right第四次移动时,right移动到D上,此时之前字符串ADCB已经包含字符D,移动left至之前字符串中D的位置的下一位。以此类推

代码

var lengthOfLongestSubstring = function(str) {
    if (!str.length) return 0;
    let tmpStr = '';  
    let maxStrLen = 0;  
    let left = 0;  
    for (let i = 0; i < str.length; i++) {
        if (tmpStr.indexOf(str[i]) !== -1) { 
            left += (str.slice(left, i).indexOf(str[i]) + 1);
            continue
        }
        tmpStr = str.slice(left, i + 1);
        maxStrLen = Math.max(maxStrLen, tmpStr.length)
    }
    return maxStrLen
};
           

所用JavaScript原生字符串函数

indexOf() 检索字符串

slice() 截取字符串,并返回截取的字符串。