Leetcode前端必会系列:无重复字符的最长子串

93 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情

引言

算法的技能对于程序员是百益而无一害,作为程序员无论是前端还是后端算法技能对于我们都是十分十分的重要,我将陆续整理并讲解前端程序员必须掌握的经典算法。

题目描述

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

示例 1:

输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。 示例 2:

输入: s = "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。 示例 3:

输入: s = "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。   请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

分析

根据题目的分析,我们知道题目可以根据多种算法解决,一种是动态规划的设计思路,另一个就是双指针,出于简单的原则我们使用双指针区解决更好。

  1. 开始定义全局双指针,一个是begin作为头指针,一个是end作为遍历的指针
  2. 第一层循环是end的遍历
  3. 第二层循环从begin到end的前一个位置,每次判断是否和当前begin位置的字符重复, 如果存在重复则将begin后移到重复位置的下一个
  4. 每次循环结束,判断最大的长度
  5. 返回结果

解答

var lengthOfLongestSubstring = function(s) {

   //无重复字符的最长子串

   if(s.length<=1) return s.length

   let begin = 0

   let max = 1

   let i,j

   for( i=1;i<s.length;i++) {

    for( j=begin;j<i;j++) {

        if(s[j]===s[i]) {

            begin = j+1

            break

        }

    }

    max = Math.max(max,j-begin+1)

   }

   return max

};

由于设计是双指针,通过分析知:算法的时间复杂度是o(n^2)。空间复杂度是o(1)。整体设计思路还是比较简洁容易的。

总结

通过对无重复字符的最长子串算法题目的讲解,大家学到了如何利用双指针进行问题的解决。双指针的巧妙计算可以优雅的在低时间和空间复杂度下完成任务。