以下为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)$