Leetcode剑指offer16不含有重复字符的最长子字符串

Leetcode16不含有重复字符的最长子字符串

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

答题:

/**
 \* @param {string} s
 \* @return {number}
 */
var lengthOfLongestSubstring = function(s) {
  let queue = []
  let maxLen = 0 
  for(let i=0;i<s.length;i++){
​    if(queue.includes(s[i])){
​      queue.splice(0,1+queue.indexOf(s[i]))
​      queue.push(s[i])
​    }else{
​      queue.push(s[i])
​      maxLen = Math.max(maxLen,queue.length)
​    }
  }
  return maxLen
};

实际上是考察你一个滑动窗口的问题,queue中包含了一个不包含重复字符的数组,如果有新加进来的字符在数组中有重复,则剔除queue中的该字符以及之前的字符。没有的话就比较一下当前数组的长度和上一个len的大小,注意这里不能直接把len执行+1操作。
双指针解法
/**

  • @param {string} s
  • @param {string} p
  • @return {number[]}
    */
    var findAnagrams = function(s, p) {
    const m = s.length,
    n = p.length,
    letterArr = [],
    res = []; //收集起始索引的结果
    if(n > m){
    return res;
    }
    // 初始化26个英文字母的字符数,为0
    for(let i = 0;i <= 26;i++){
    letterArr.push(0);
    }
    // 收集p字符串的字符
    for(let j = 0;j < n;j++){
    letterArr[p[j].charCodeAt() - “a”.charCodeAt()]–;
    }
    // 定义开始指针
    let left = 0;
    for(let right = 0;right < m;right++){
    const x = s[right].charCodeAt() - “a”.charCodeAt();
    letterArr[x]++;
    while(letterArr[x] > 0){
    letterArr[s[left].charCodeAt() - “a”.charCodeAt()]–;
    left++;
    }
    if(right - left + 1 === n){
    //此时left就是满足条件的起始索引
    res.push(left);
    }
    }
    return res;
    };
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值