找出两个字符串中所有共同的子串_LeeCode 无重复字符的最长子串

35579fa753690bcb417611d94444dd74.png

题目来源

传送门

题目描述

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

示例

给定 "abcabcbb" ,没有重复字符的最长子串是"abc",那么长度就是3;给定 "bbbbb" ,最长的子串就是 "b",长度是1;给定 "pwwkew",最长子串是"wke",长度是3。请注意答案必须是一个子串,"pwke"是子序列而不是子串

思路分析

abcabcbb 为例,要找到子串,首先遍历每个字符;其次要找到最长的那个,肯定是要有参照对象,我需要一个变量 str 去缓存当前最长子串;我们最终要得到的是子串的长度,所以还需要定义变量 maxLen,当发现新元素时更新 strmaxLen

如果字符 s[i],不在 str 中,那么更新 strmaxLen;相反,重新截取并生成新的 str,这时的 str 肯定不是最长,str.length 小于或等于 maxLen,因此不用更新 maxLen

这里有个非常细节的地方:

maxLen = maxLen < str.length ? str.length : maxLen;

maxLen是通过 str.length 来更新的,但是为什么还需要三目运算?

举例来说 nfpdmpimaxLen 最大为5,遍历结束后 strdmpi,长度为4,所以需要取较大值。

最终代码如下

function lengthOfLongestSubstring(s) {
  let maxLen = 0; // 最长无重复子串的长度
  let str = ''; // 当前无重复子串,即活动窗口
  const l = s.length; // 目标字符串的长度
  for (let i = 0; i < l; i++) {
    let chart = s[i];
    let index = str.indexOf(chart); // 找出chart在窗口中的位置
    if (index === -1) {
      str += chart; // 如果chart不在窗口中,则扩大窗口
      maxLen = maxLen < str.length ? str.length : maxLen; // 更新maxLen;窗口中子串的长度和maxLen之间取最大值
    } else {
      // 如果chart在窗口中,则表示字符重复,重新给str赋值
      // substring表示截取字符串,但不应该包含当前位置,所以要index+1
      str = str.substring(index + 1) + chart;
    }
  }
  return maxLen;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值