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