返回
无重复字符的最长子串:程序员面试必刷算法
前端
2024-01-26 19:12:49
大厂面试越来越难,对算法的要求也越来越多。当面试官问到一个算法题,给出一份完美答案能大大提高面试官的好感度。本系列就是致力于打造一套适用于前端的算法。
无重复字符的最长子串
给定一个字符串,请你找出其中不含有重复字符的最长子串。
示例 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,那么我们就需要自己实现一个数据结构来存储已经出现的字符。我们可以使用一个对象来存储已经出现的字符,并将字符作为对象的键,将出现的次数作为对象的