javascript - 我的算法可以被视为 O(n) 吗?“查找具有唯一字符的最长子字符串”
问题描述
我偶然发现了这个练习:
创建一个返回具有唯一字符的最长子字符串的函数。
我只是想知道我提出的解决方案是否已经完成了 O(n) 时间复杂度。
IE:
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;
}
解决方案
我喜欢两个指针的方法:
function f(S){
let maxLength = 1
let idx = 0
let l = 0
let r = 1
let set = new Set([S[0]])
for (; l<S.length-1, r<S.length;){
if (!set.has(S[r]))
set.add(S[r++])
else
set.delete(S[l++])
let currLength = r - l
if (currLength > maxLength){
maxLength = currLength
idx = l
}
}
return S.substr(idx, maxLength)
}
console.log(f('asaafg'))
推荐阅读
- sql - Oracle SQL 折叠数据行
- jsp - Jsp——两页合一
- php - php 文件在实时服务器上显示错误
- javascript - 未捕获的 SyntaxError:空行中有意外的标识符?
- matlab - 如何在 MATLAB 上创建一个 if 语句,将低于某个阈值的像素替换为 NaN?
- c++ - 在运行时以编程方式检测 CPU 架构
- powershell - 在 60 分钟或更新的 Windows 服务器之间复制文件
- java - 为什么当 rowKey 属性为主键时 JPA 实体会抛出异常?
- php - 更新失败:选择拒绝用户的命令(vahejaba @ localhost)
- magento2 - 致命错误:未捕获的错误:在布尔值上调用成员函数 toHtml()