以下为ChatGPT自动生成的解答,正确与否请自行判断。
BFE.devAI解答 - JavaScript 代码题
112. 重複の文字を削除する
解题思路:
题目要求去掉字符串中重复的字符,且返回字典序最小的字符串。因此,可以使用贪心算法,从最小的字符开始,依次在字符串中查找这个字符,并且保证后面的字符一定比前面的字符要“小”。
同时,为了保证字典序最小,需要满足在找到下一个字符之前,先判断当前字符串是否符合要求。如果符合要求,则直接返回,否则继续找下一个字符。
具体步骤如下:
- 构建一个桶,记录每个字符出现的次数。
- 遍历字符串,对于每个字符,先检查桶中该字符的出现次数是否为0。如果为0,则跳过该字符;否则,将该字符加入当前结果字符串中。
- 对于加入结果字符串中的字符,将其桶中的出现次数减1。
- 检查当前结果字符串是否符合要求。即,是否还存在其他字符比该字符小且未加入结果字符串中。如果存在,继续找下一个字符;否则,停止查找,直接返回结果字符串。
根据贪心算法的思路,可以使用一个指针来记录当前结果字符串中最后一个字符的位置,以判断后面的字符是否合法。
JavaScript 代码实现如下:
function removeDuplicate(str) {
const bucket = new Array(26).fill(0); // 构建桶
const n = str.length;
let p = -1; // 当前结果字符串中最后一个字符的位置
let res = ''; // 结果字符串
for (let i = 0; i < n; i++) {
const c = str.charAt(i);
const idx = c.charCodeAt() - 'a'.charCodeAt(); // 计算字符对应的桶的索引
if (bucket[idx] === 0) continue; // 如果该字符的出现次数为0,跳过该字符
let k = p; // 初始化指针
while (k >= 0 && res.charAt(k) > c) { // 查找合法字符
const prevIdx = res.charAt(k).charCodeAt() - 'a'.charCodeAt();
if (bucket[prevIdx] === 0) break; // 如果后面的字符中已经没有比该字符小的了,则停止查找
k--; // 指针左移
}
if (k >= 0 && res.charAt(k) >= c) { // 如果存在合法字符,则直接返回结果字符串
bucket[idx]--; // 桶中该字符的出现次数减1
continue;
}
// 如果不存在合法字符,则将该字符加入结果字符串
while (p >= 0 && res.charAt(p) > c && bucket[res.charAt(p).charCodeAt() - 'a'.charCodeAt()] > 0) {
p--; // 将不符合要求的字符从结果字符串中删除
}
res = res.substring(0, p + 1) + c; // 将该字符加入结果字符串
p++; // 指针右移
bucket[idx]--; // 桶中该字符的出现次数减1
}
return res;
}
时间复杂度:$O(n)$
空间复杂度:$O(1)$