【问题标题】:Can my algorithm be considered as O(n)? "Finding the longest substring with unique characters"我的算法可以被视为 O(n) 吗? “查找具有唯一字符的最长子字符串”
【发布时间】: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


【解决方案1】:

我喜欢两个指针的方法:

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'))

【讨论】:

    猜你喜欢
    • 2014-02-02
    • 1970-01-01
    • 2019-03-11
    • 1970-01-01
    • 2019-09-04
    • 2023-04-05
    • 2011-12-22
    • 1970-01-01
    • 2012-04-23
    相关资源
    最近更新 更多