前端web—每日一练(6.23)--无重复的最长子串

本文详细介绍了两种解决给定字符串中寻找最长无重复字符子串问题的解题思路。方法一是利用集合(Set)进行滑动窗口操作,当遇到重复字符时,从集合中移除并更新左指针;方法二是借助Map记录字符出现的索引,当发现重复字符时,左指针回溯至上次出现字符的下一个位置。这两种算法都能够有效地找到最长无重复字符子串的长度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述

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


var s = "dacab";

解题思路一

1.创建一个set
2.两个指针,第一个指向字符串的开头j,第二个随着for循环遍历字符串i.
3.如果set里没有s[i],说明目前为止还没有重复的字符,把s[i]添加到set里,然后更新最大不重复字符的数量。
4.如果set里有s[i],则从set里开始删除s[j],并且递增j,再检查set里是否有s[i],
如此反复直到set里没有s[i]为止。
5.重复步骤3和4,直到遍历完整个字符串

代码如下

const set = new Set();
var i = 0,
  j = 0,
  maxlength = 0;
if (s.length == 0) {
  return 0;
}
for (i; i < s.length; i++) {
  if (!set.has(s[i])) {
    set.add(s[i]);
    maxlength = Math.max(maxlength, set.size);
  } else {
    while (set.has[s[i]]) {
      set.delete[s[j]];
      j++;
    }
    set.add(s[i]);
  }
}
console.log(maxlength);

解题思路二

双指针,右指针不断移动,每遇到一个字符就通过map记录该字符及其最后一次出现的索引值,若判断是出现过的字符,且上次出现的位置大于等于左指针,则左指针移到上一次出现的位置的下一个位置

举个栗子:字符串bacab

  • 初始化左右指针均为0,将(b,0),加入map。
  • 右指针移动到1,a无重复,将(a,1),加入map。当前时刻字串为ba,长度为2.
  • 右指针移动到2,c无重复,将(c,2),加入map。当前时刻字串为bac,长度为3.
  • 右指针移动到3,a出现重复 且a上一次出现的位置1大于左指针的位置0,移动左指针到2,当前时刻字串为ca,长度为2,将(a,3),加入map。
  • 右指针移动到4,b出现重复但b上一次出现的位置0小于左指针的位置2,若左指针移动,则左指针移动到1,当前时刻字串为acab,出现重复字符。所以此时左指针不移动,当前时刻字串为cab,长度为3,并将(b,4),加入map。

代码如下

var left = 0,
  ans = 0;
let map = new Map();

for (var i = 0; i < s.length; i++) {
  if (map.has(s[i]) && map.get(s[i]) >= left) {
    left = map.get(s[i]) + 1;
  }
  map.set(s[i], i);
  if (i - left + 1 > ans) {
    ans = i - left + 1;
  }
}
console.log(ans);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值