以下为ChatGPT自动生成的解答,正确与否请自行判断。

BFE.devAI解答 - JavaScript 代码题
87. 返回最长的不重复子字符串

解答:

可以使用滑动窗口的思路解决此题。维护一个窗口,初始值为字符串的第一个字符,然后依次向右移动窗口,如果当前字符不在窗口中,则将其加入窗口,更新最长子字符串;如果当前字符已经在窗口中,则将窗口左边界移动到重复字符的下一个位置,继续移动窗口直到遍历完整个字符串。

JavaScript代码如下:

function longestUniqueSubstr(str) {
  let left = 0, right = 0;
  let maxLen = 0, maxStr = '';
  const windowSet = new Set(); // 维护窗口中的字符集合
  while (right < str.length) {
    if (!windowSet.has(str[right])) {
      // 如果当前字符不在窗口中,则将其加入窗口
      windowSet.add(str[right]);
      if (right - left + 1 > maxLen) {
        // 更新最长子字符串
        maxLen = right - left + 1;
        maxStr = str.slice(left, right + 1);
      }
      right++; // 右侧指针向右移动
    } else {
      // 如果当前字符已经在窗口中,则将窗口左边界移动到重复字符的下一个位置
      windowSet.delete(str[left]);
      left++; // 左侧指针向右移动
    }
  }
  return maxStr;
}

时间复杂度为 O(n),空间复杂度为 O(min(m, n)),其中 m 是字符集大小,n 是字符串长度。在本题的情况下,字符集大小为常数,因此时间和空间复杂度均为 O(n)。

针对可优化的部分,可以使用哈希表来代替 Set 来记录窗口中的字符出现次数,可以进一步减小空间复杂度。