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); }
  • 相关阅读:
    LeetCode 141. Linked List Cycle(判断链表是否有环)
    LeetCode 680. Valid Palindrome II(双指针)
    >/dev/null 2>&1
    18个最佳代码编辑器
    vi和vim常用命令
    搞定Windows连Linux三大件:SecureCRT,FileZilla,NX
    define和typedef的区别
    C++ const,static成员
    C++虚函数练习题
    c++虚函数解析
  • 原文地址:https://www.cnblogs.com/lanpang9661/p/12467111.html
Copyright © 2011-2022 走看看