3. 无重复字符的最长子串:
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
事例:
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
示例 4:
输入: s = ""
输出: 0
解决方案:
去重获取长度最长范围, 利用递归 匹配当前索引到最大值区间是否匹配,
false:每次长度减一 继续递归
true: 返回长度
/**
* @param {string} s
* @return {number}
*/
var lengthOfLongestSubstring = function(s) {
const arrS = s.split("");
const maxLen = [...new Set(arrS)].length;
function test (len) {
const d = Array(len).fill(0);
for (let i = 0; i < arrS.length; i++) {
const ff = d.reduce((arr, item, index) => {
let da = arr?arr: [];
if (arr.includes(arrS[i + index])) {
da = [];
}
else {
arrS[i + index] && da.push(arrS[i + index]);
}
return da;
}, [])
if (ff.length === len) {
return len;
}
else {
if ((i+1)===arrS.length) {
return test(len-1)
}
}
}
}
return maxLen===0?0: test(maxLen)
};
/**
* @param {string} s
* @return {number}
*/
var lengthOfLongestSubstring = function(s) {
const arrS = s.split("");
const maxLen = [...new Set(arrS)].length;
function test (len) {
for (let i = 0; i < arrS.length; i++) {
if ([...new Set(arrS.slice(i, i + len))].length === len) {
return len;
}
else {
if ((i+1)===arrS.length) {
return test(len-1)
}
}
}
}
return maxLen===0?0: test(maxLen)
};
扩大区间, 区间内存在元素j时,从存在位置扩张;若不存在返回区间长度
/**
* @param {string} s
* @return {number}
*/
var lengthOfLongestSubstring = function(s) {
let i=0, res=0, n=0;
for (let j = 0; j < s.length; j++){
n = s.slice(i,j).indexOf(s[j]);
if (n === -1){
res = Math.max(res,j+1-i);
}else{
i += n+1;
}
}
return res;
};