leetcode:3.longest-substring-without-repeating-characters

264 阅读1分钟

题目描述

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

解题思路

最直接的思路应该是暴力法,获得该字符串的所有子串并获取最大长度,但时间复杂度肯定超标。一次,使用滑动窗口解题:
对于不重复子串Sij,以及字符S[j+1]。若S[j+1]在Sij子串中不存在,则将j+1,若存在,则截取Sij+1中不重复子串,在此过程中记录出现过的最大长度即为结果

代码

JS版

/**
 * @param {string} s
 * @return {number}
 */
var lengthOfLongestSubstring = function(s) {
  let maxString = 0;
  let i = 0, j = 0;
  let strSet = new Set();
  let n = s.length;
  while(i < n && j < n){
    let char = s.charAt(j);
    if(strSet.has(char)){
      strSet.delete(s.charAt(i++));
    }else{
      strSet.add(s.charAt(j++));
      maxString = Math.max(maxString, j - i);
    }
  }
  return maxString;
};

TS版

/**
 * @param {string} s
 * @return {number}
 */

const lengthOfLongestSubstring = (s:string):number => {
  let maxString:number = 0;
  let i:number = 0, j:number = 0;
  let strSet:Set<string> = new Set();
  let n:number = s.length;
  while(i < n && j < n){
    let char:string = s.charAt(j);
    if(strSet.has(char)){
      strSet.delete(s.charAt(i++));
    }else{
      strSet.add(s.charAt(j++));
      maxString = Math.max(maxString, j - i);
    }
  }
  return maxString;
};

PY版

#
# @lc app=leetcode id=3 lang=python3
#
# [3] Longest Substring Without Repeating Characters
#

# @lc code=start
class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        if not s:return 0
        lookup = list()
        n = len(s)
        max_len = 0
        cur_len = 0
        for i in range(len(s))):
            val = s[i]
            if not val in lookup:
                lookup.append(val)
                cur_len+=1
            else:
                index = lookup.index(val)
                lookup = lookup[index+1:]
                lookup.append(val)
                cur_len = len(lookup)
            if cur_len > max_len:
                max_len = cur_len
        return max_len
 # @lc code=end

时间复杂度

O(2n) = O(n),最糟糕情况即为ij均遍历完全
优化:在处理i时,可以不用一步步便利,直接采取map结构储存,并直接删除至重复重复字母,此时时间复杂度为O(n);