返回

无重复字符的最长子串:程序员面试必刷算法

前端

大厂面试越来越难,对算法的要求也越来越多。当面试官问到一个算法题,给出一份完美答案能大大提高面试官的好感度。本系列就是致力于打造一套适用于前端的算法。

无重复字符的最长子串

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

示例 1:

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

示例 2:

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

示例 3:

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

请注意,题目中所有字符都是小写字母。

解法一:使用API

我们可以使用JavaScript的API来解决这个问题。具体来说,我们可以使用Set数据结构来存储已经出现的字符。当我们遍历字符串时,如果当前字符已经存在于Set中,那么我们就更新无重复字符的最长子串的长度。如果当前字符不存在于Set中,那么我们就将它添加到Set中,并更新无重复字符的最长子串的长度。

/**
 * 使用API解决无重复字符的最长子串问题
 *
 * @param {string} s 输入字符串
 * @return {number} 无重复字符的最长子串的长度
 */
const lengthOfLongestSubstring = (s) => {
  // 创建一个Set来存储已经出现的字符
  const set = new Set();

  // 创建一个变量来存储无重复字符的最长子串的长度
  let maxLength = 0;

  // 创建一个变量来存储当前无重复字符子串的长度
  let currentLength = 0;

  // 遍历字符串
  for (let i = 0; i < s.length; i++) {
    // 如果当前字符已经存在于Set中,那么就更新无重复字符的最长子串的长度
    if (set.has(s[i])) {
      maxLength = Math.max(maxLength, currentLength);
      currentLength = 0;
      set.clear();
    }

    // 如果当前字符不存在于Set中,那么就将它添加到Set中,并更新无重复字符的最长子串的长度
    else {
      set.add(s[i]);
      currentLength++;
    }
  }

  // 更新无重复字符的最长子串的长度
  maxLength = Math.max(maxLength, currentLength);

  // 返回无重复字符的最长子串的长度
  return maxLength;
};

解法二:不使用API

如果我们不想使用API,那么我们就需要自己实现一个数据结构来存储已经出现的字符。我们可以使用一个对象来存储已经出现的字符,并将字符作为对象的键,将出现的次数作为对象的