LC3无重复最长字串

在这里插入图片描述
链接:无重复最长字串

步骤:
定义两个指针i,j 表示当前扫描到的字串是[i,j] (闭区间)扫描过程中维护一个哈希表unordered_map<char,int> hash 表示[i, j] 中每个字符出现的次数、

  1. 指针j 向后移动一位,同时将哈希表中s[j] 的次数 +1 hash[s[j]] ++
  2. 假设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开始 删除两个数

  1. 使用IndexOf() 判断当前字符有没有在数组中arr中出现过,
    如果出现过:从开头到当前字符串全部删掉
  2. 在窗口右边放入新的字符
  3. 更新最大值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;
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值