题目:
解题1:待优化
/**
* @param {string} s
* @return {number}
*/
var lengthOfLongestSubstring = function(s) {
let m = {};
let max = 0;
let p =0;
let i = 0;
while(p<s.length && i< s.length) {
i = p;
while(i<s.length) {
if (m[`${s[i]}`]) {
p = m[`${s[i]}`];
m = {};
break;
} else {
m[`${s[i]}`] = i+1;
i = i+1;
max= max >i-p? max : i-p;
}
}
}
return max;
};
思路:
- 遍历的过程中,记录每个值的下标,形成“字典”
- 遇到重复值,从该重复值上一次出现的位置重新开始遍历,并重新记录值和下标,形成新“字典”。
待改进:
- 遇到重复值后,可以不用从上一次出现的位置重新遍历,但要将上一次重复位置及 上次重复位置之前的所有值 从 “字典”清除。这样遇到重复值后,可以直接接着遍历。
- 所需要,就是维护一个干净的“字典”。
解题2: 优化1
* @param {string} s
* @return {number}
*/
var lengthOfLongestSubstring = function(s) {
let m = {};
let max = 0;
let l = 0; //上一次重复的值的下标+1
let p = 0; //上上次重复的值的下标
for (let i = 0; i < s.length; i++) {
if (!m[`${s[i]}`]) {
m[`${s[i]}`] = i + 1;
max = Math.max(max, i - p + 1)
} else {
l = m[`${s[i]}`];
for (let j = p; j < l; j++) {
m[`${s[j]}`] = 0;
}
m[`${s[i]}`] = i + 1;
max = Math.max(max, i - p )
p = l;
}
}
return max;
};
解题3:优化2
/**
* @param {string} s
* @return {number}
*/
var lengthOfLongestSubstring = function(s) {
let m = {};
let max = 0;
let l = 0; //上一次重复的值的下标
let p = 0; //当前最长匹配串的起始下标
for (let i = 0; i < s.length; i++) {
if (m[`${s[i]}`] !== undefined) {
l = m[`${s[i]}`];
for (let j = p ; j < l + 1; j++) {
m[`${s[j]}`] = undefined;
}
p = l + 1;
}
m[`${s[i]}`] = i;
max = Math.max(max, i - p +1 )
}
return max;
};