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); }
  • 相关阅读:
    js_css_dl.dt实现列表展开、折叠效果
    property_自己编写一个读取Property文件的Util类
    HttpClient_002_中文乱码、HttpClient中文乱码透析、总结
    HttpClient_001_初步实现项目01的servlet,与项目02的servlet,之间数据访问
    jsp:中文乱码解决
    linux命令
    js 监测from表单中的input和select,时时监测,没有输入或选择信息报错,不允许提交数据
    数据库的那些事
    待参考
    layer.open多次触发,遮罩层覆盖content的解决办法
  • 原文地址:https://www.cnblogs.com/lanpang9661/p/12467111.html
Copyright © 2011-2022 走看看