zoukankan      html  css  js  c++  java
  • 3. 无重复字符的最长子串

    2020-03-12
    无重复字符的最长子串
    给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
    示例:
    输入: abcabcbb
    输出: 3
    解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
    输入: pwwkew
    输出: 3
    解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
    说明:
    • 请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
    题解:
    思路1:双指针暴力解
    两个for循环暴力拆解。for中套for效率特别低。
     
    var lengthOfLongestSubstring = function (s) {
      let obj = {}; // 声明一个对象用s[i]作为key存储当前记录中有哪些字符串
      let len = 0; // obj中记录的key的长度
      let result = 0; // 返回的最长字串长度
      for (let i = 0; i < s.length; i++) { // 第一个指针
        obj[s[i]] = true; // 每次更新第一个指针先把当前s[i]作为obj的第一个key存进去
        len = 1; 
        for (let j = i + 1; j < s.length; j++) { // 第二个指针 从i之后开始遍历
          if (!obj[s[j]]) { // 如果obj中没有记录则记录进去
            obj[s[j]] = true;
            len++;
            result = Math.max(result, len); // 当遍历到s.length时需要取一次最大值 所以写这一条
          } else {
            result = Math.max(result, len); // 如果obj中已经有了这个key则说明重复了,取较大值作为result
            obj = {}; // 将obj清空
            break; // 退出第二指针
          }
        }
      }
      return Math.max(result, len);
    }
    思路2:滑动窗口
    用一个子数组记录存入的子字符串,每次循环一个新的子字符串都判断数组中是否存在
     
    function lengthOfLongestSubstring(s) {
      if (s.length < 2) { // 如果s的长度小于2直接返回就行了
        return s.length;
      }
      s = s.split(''); // 将s打散成数组
      let sonArr = []; // 记录无重复字串的子数组
      let len = 0; // 记录最大长度
      for (let i = 0; i < s.length; i++) { // 循环s
        let index = sonArr.indexOf(s[i]); 
        if (index < 0) { // 如果子数组中没有,直接push进去
          sonArr.push(s[i]);
        } else { 
          len = Math.max(sonArr.length, len); // 如果子数组中已经存在当前的s[i], 
                             // 那么获取当前子数组长度和len的长度比较,取较大值赋值len
    sonArr.splice(0, index + 1); // 由于子数组是无重复字串的数组,出现重复的项则要把原来项之前的去掉才能放进重复项 sonArr.push(s[i]); // 子数组已经把上一次出现的s[i]截取了,把新出现的s[i]插入 } } return Math.max(sonArr.length, len); }
  • 相关阅读:
    [转]C#进阶系列——WebApi 接口参数不再困惑:传参详解
    Netty中的三种Reactor(反应堆)
    I/O模型之三:两种高性能 I/O 设计模式 Reactor 和 Proactor
    【转】第8章 前摄器(Proactor):用于为异步事件多路分离和分派处理器的对象行为模式
    mysql 数据库 自动截取数据的问题---mysql的sql_model的四种模式:宽松模式、严格模式
    spring-session之四:Spring Session下的Redis存储结构
    Mysql auto_increment总结
    mysql实战优化之一:sql优化
    mysql字符集和校对规则(Mysql校对集)
    Oracle B-tree、位图、全文索引三大索引性能比较及优缺点汇总
  • 原文地址:https://www.cnblogs.com/lanpang9661/p/12467111.html
Copyright © 2011-2022 走看看