leetcode2 查找最长不重复字串问题

来源:互联网 发布:js面向对象的理解 编辑:程序博客网 时间:2024/05/17 22:39

leetcode2 查找最长不重复字串问题 javascript
- 常规解法

/** * @param {string} s * @return {number} */var lengthOfLongestSubstring = function (s) {    let currentSub = {}, //记录当前最长串的字母        currentLength = 0, //当前串的长度        maxLength = 0; //记录当前的最长串    for (let i = 0; i < s.length; i++) {        if (currentSub[s[i]] === undefined) {            currentLength += 1;            currentSub[s[i]] = i; //记录在哪个位置        } else {            //遇到重复字符串            maxLength = maxLength <= currentLength                ? currentLength                : maxLength;            currentLength = i - currentSub[s[i]];            //更新当前串的hash             let begin = currentSub[s[i]] + 1;             currentSub = {};            for (let j = begin; j <= i; j++) {                currentSub[s[j]] = j;            }        }    }    return maxLength > currentLength ? maxLength:currentLength;//输入为1个字母的情况};

普通的解法,没用用啥js函数,c语言思路,用hash记录下每个子串的字母,如果hash中的已经存在则表示遇到重复字母开始下一个子串查找。使用javascrupt有一个坑就是 if (currentSub[s[i]] === undefined)这句我一开始写成了if (!currentSub[s[i]]),这就有问题了,当currentSub[s[i]]为0时,也就是字符串的第一个字母,会判断为已经存在在hash中,因为js中!0 == true。上面解法的复杂度是O(n平方)。因为会有一个回退记录新子串的hash的过程。高端点的是用动态规划,以后学会了再更新吧hhh

  • 使用js函数的算法
var lengthOfLongestSubstring = function(s) {    var cur_str = '', max_len = 0;    for (let i = 0; i < s.length; i++) {        let last_pos = cur_str.indexOf(s[i]);        if (last_pos === -1) {            cur_str += s[i];        } else {            max_len = cur_str.length > max_len ? cur_str.length : max_len;            cur_str = cur_str.substr(last_pos + 1) + s[i];        }    }    return max_len = cur_str.length > max_len ? cur_str.length : max_len;};

其实计算的思路和上面的差不多,不过这个就比较快了

原创粉丝点击