以下为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 来记录窗口中的字符出现次数,可以进一步减小空间复杂度。