为什么我在leetcode上的代码lengthOfLongestSubstring()在控制台中运行良好,但在提交后失败



问题在leetcode上,编号3:https://leetcode.com/problems/longest-substring-without-repeating-characters/submissions/

这是我的代码:

/**
* @param {string} s
* @return {number}
*/
var lengthOfLongestSubstring = function(s) {
console.log('input', s);
var max_length = s.length;
var results = [];

var isDupCheck = function(arr){
var s = [];
var hasDup = false;
arr.forEach(function(el){
if (!s.includes(el)) {
s.push(el);
} else {
hasDup = true;
}
})
return hasDup;
}

for (var j = 0; j<max_length; j++)
for (var i = 1; i<max_length; i++) {
var substr = s.substr(j, i);
var isDup = isDupCheck(substr.split(''));
if (!isDup) {
results.push(substr);
}
}
var length = 0;
var picked;
console.log("results:", results);
results.forEach(function(el){
if (el.length > length) {
length = el.length;
picked = el;
}
});
var picked_length = picked.split('').length;
console.log(picked_length); // expected output
return 5; // If I comment this line, there will be an ERROR.
return picked_length;
};

console.log(picked_length)输出的正是预期的解。但如果我返回picked_length,然后提交,就会出现错误:

Line 42 in solution.js
var picked_length = picked.split('').length;
^
TypeError: Cannot read properties of undefined (reading 'split')
Line 42: Char 30 in solution.js (lengthOfLongestSubstring)
Line 57: Char 19 in solution.js (Object.<anonymous>)
Line 16: Char 8 in runner.js (Object.runner)
Line 48: Char 26 in solution.js (Object.<anonymous>)
at Module._compile (node:internal/modules/cjs/loader:1101:14)
at Object.Module._extensions..js (node:internal/modules/cjs/loader:1153:10)
at Module.load (node:internal/modules/cjs/loader:981:32)
at Function.Module._load (node:internal/modules/cjs/loader:822:12)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
at node:internal/main/run_main_module:17:47

我的猜测是,根据他们的约束条件,他们给了你一个空字符串-

0 <= s.length <= 5 * 104

在这里查看您的代码-

var picked;
console.log("results:", results);
results.forEach(function(el) {
if (el.length > length) {
length = el.length;
picked = el;
}
});

如果没有结果,则不向picked分配任何内容。如果您将它初始化为一个空字符串,那么问题应该会消失。

编辑

不管它值多少钱,我忍不住自己去试这个问题。在不违反他们对时间/内存的限制的情况下,很难解决这个问题,但这是我能想到的最好的解决方案。。。它工作得很好,因为javascriptSet保证了迭代顺序,但元素的查找时间应该比使用数组更快:

/**
* @param {string} s
* @return {number}
*/
var lengthOfLongestSubstring = function(s) {
if (!s?.length) return 0;

let longest = 0;
let seenChars = new Set();

for (const char of s) {
if (seenChars.has(char)) {
longest = Math.max(longest, seenChars.size);

for (const seenChar of seenChars) {
seenChars.delete(seenChar);
if (seenChar === char) break;
}
}

seenChars.add(char);
}            

return Math.max(longest, seenChars.size);
};

最新更新