LeetCode 算法入门 — 无重复字符的最长子串

75 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

无重复字符的最长子串

原题地址

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

示例 1:

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

示例 2:

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

示例 3:

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

提示:

  • 00 <= s.length <= 51045 * 10^4
  • s 由英文字母、数字、符号和空格组成

思路分析

  1. 边界值判定,字符串长度小于等于1时,返回字符串的长度;
  2. 定义结果值 res = 1;
  3. 从头开始循环,找到以当个字符为起始点的最长子串。方法一,使用字符串来存储子串,方法二使用map来存储。

AC 代码

方法一

/**
 * @param {string} s
 * @return {number}
 */
var lengthOfLongestSubstring = function(s) {
    if (s.length <= 1) return s.length
    let res = 1
    for(let i = 0; i < s.length; i++) {
        let str = s[i]
        for(let j = i + 1; j < s.length; j++) {
            if(str.indexOf(s[j]) === -1) {
                str += s[j]
                res = Math.max(res, j - i + 1)
            } else {
                break
            }
        }
    }
    return res
};

结果:

  • 执行结果: 通过
  • 执行用时:192 ms, 在所有 JavaScript 提交中击败了17.70%的用户
  • 内存消耗:47.8 MB, 在所有 JavaScript 提交中击败了11.73%的用户
  • 通过测试用例:987 / 987

方法二

/**
 * @param {string} s
 * @return {number}
 */
var lengthOfLongestSubstring = function(s) {
    if (s.length <= 1) return s.length
    let res = 1
    for(let i = 0; i < s.length; i++) {
        let map = new Map()
        map.set(s[i], 1)
        for (let j = i + 1; j < s.length; j++) {
            if (!map.has(s[j])) {
                map.set(s[j], 1)
                res = Math.max(res, j - i + 1)
            } else {
                break
            }
        }
    }
    return res
};

结果:

  • 执行结果: 通过
  • 执行用时:240 ms, 在所有 JavaScript 提交中击败了13.89%的用户
  • 内存消耗:47.8 MB, 在所有 JavaScript 提交中击败了12.90%的用户
  • 通过测试用例:987 / 987

END