本题题目:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。本题选自leetcode第 3 题。
无重复字符的最长子串的长度
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
示例 4:
输入: s = ""
输出: 0
解题方法
本方法通过
前后双指针来限定当前内容是不重复的,并且每次都会判断是否需要最新开始值,根据后指针的位置 - 前指针的位置 + 1,并且跟当前的最大值进行比较,来得出最终的结果。
function lengthOfLongestSubstring(str) {
if (str === "") return 0;
let start = 0, maxLen = 0;
const map = new Map();
const len = str.length;
for(let i = 0; i < len; i++) {
const c = str[i];
if (map.has(c)) {
start = Math.max(map.get(c) + 1, start)
}
map.set(c, i);
maxLen = Math.max(i - start + 1, maxLen);
}
return maxLen;
}
无重复字符的最长子串
试着修改一下本题,找到无重复字符的最长子串有哪些,目前先考虑只有一个最长子串的情况。
function lengthOfLongestSubstring(str) {
if (str === "") return null;
let start = 0, maxLen = 0, resStr = null;
const map = new Map();
const len = str.length;
for(let i = 0; i < len; i++) {
const c = str[i];
if (map.has(c)) {
start = Math.max(map.get(c) + 1, start);
}
map.set(c, i);
// 当前差值大于maxLen的时候记录下来子串
if (i - start + 1 > maxLen) {
resStr = str.slice(start, i + 1);
}
maxLen = Math.max(i - start + 1, maxLen);
}
return resStr;
}
总结
目前感觉这种方法还是比较方便的。