3. 无重复字符的最长子串

本文介绍了一种使用滑动窗口技巧来寻找给定字符串中无重复字符最长子串的方法,通过维护一个字符映射并不断更新窗口,避免重复字符的搜索,提供了一个Java函数实现。

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

思路

  这题做法为滑动窗口(为什么用滑动窗口?如果暴力以每个字符开头开始暴力的话时间太久了,滑动窗口左边直接去掉的是完全没必要作为开头的所以利用滑动窗口一齐排除,省去了大部分的步骤),需要判断新加入窗口的右边有没有在这个出现过,如果没有出现过说明没有重复那就继续扩大窗口的右边,如果有重复的值,那就要注意一下了。这个无重复字符子串不可能再包括前面那个与它重复的字符了,因为是子串那么重复前面的也不能要了但是前面那个重复的后面那些字符串肯定和这个新出现的不相等还可以继续保留。
  这里需要注意一下,出现重复的 前面的字符也需要在map表中删除掉,不删会影响后面的结果。

代码示例

func lengthOfLongestSubstring(s string) int {
  if len(s)<=1{
    return len(s)
  }
  result:=1
  left:=0
  m:=make(map[byte]int)
  m[s[0]]=0

  for i:=1;i<len(s);i++{
    if pos,ok:=m[s[i]];ok{
      if i-left>result{
        result=i-left
      }
      for j:=left;j<pos;j++{
        delete(m,s[j])
      }
      left=pos+1
    }
    m[s[i]]=i
  }

  if len(s)-left>result{
    result=len(s)-left
  }

  return result
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值