【发布时间】:2019-08-06 09:55:05
【问题描述】:
我偶然发现了这个练习:
创建一个函数,该函数返回具有唯一性的最长子字符串 人物。
我只是想知道我提出的解决方案是否达到了 O(n) 时间复杂度。
即:
getMaxSubStr("linkshortener") -> "linkshorte"
只有一个 for 循环没有嵌套,所以这应该是 O(n) 对的,让我怀疑的是,当 tempStr 偶然发现一个重复字符时,迭代器会回到最后一次看到重复字符的字符串索引,所以这增加了需要完成的运行时操作,并且不确定它是否仍然是 O(n)
async function maxUniqueStr(string) {
let maxStr = "";
let tempStr = "";
let lastSeen = {};
for (let i = 0; i < string.length; i++) {
let char = string.charAt(i);
if (tempStr.includes(char)) {
i = lastSeen[char];
tempStr = "";
console.log("-continue-", i);
continue;
}
tempStr += char;
maxStr = tempStr.length > maxStr.length ? tempStr : maxStr;
lastSeen[char] = i;
}
return maxStr;
}
【问题讨论】:
-
子字符串应该从 start 开始,还是介于两者之间?
-
tempStr.includes这增加了额外的迭代,所以,你的功能不是O(n) -
可以在任何地方,只要 substr 是具有唯一字符的最长 substr,即数据结构 -> astruc
-
@Liam 哦,是的,我忘了还有一个 O(n),在 O(n) 内
-
另外
lastSeen[char]也是O(n log n)操作,因为它是hashtable lookup。您永远无法在真正的 O(n) 性能中做到这一点。 TBH 我怀疑这也很重要。你为什么在乎?
标签: javascript algorithm time-complexity big-o