题目
给定一个字符串,求其中没有重复字符的最长子串的长度,子串要求连续
- 和递增子序列相比,该题还多了一个限制条件,i 位置的最长子串取决于 i-1 位置的最长子串和 i 位置字符之前出现位置相比,较短的那个
- 因为 i-1 位置的最长子串不能保证里面没有和 i 位置重复的子串,所以还要和 i 位置之前出现的字符位置相比,取较短的那个
function process(str) {
let res = 0,
preIndex = -1, // i 位置字符之前出现的位置
currentLen = 0, // 无重复字符子串长度
map = {}; // 记录每个位置字符之前出现的位置
for (let i = 0; i < str.length; i++) {
preIndex = Math.max(preIndex, map[str[i]] || -1); // 获取 i-1 位置子串位置和 i 位置之前出现位置 最近(短)那个
currentLen = i - preIndex; // 根据索引换算成长度
res = Math.max(res, currentLen);
map[str[i]] = i; // 记录 i 位置字符位置
}
return res;
}