问题描述
给定一个字符串 s
,需要去除重复的字母,只保留第一次出现的字母,返回去除重复字母后的最小可能字符串。
解法一
解题思路:
为了解决这个问题,我们可以采用贪心算法和栈(Stack)数据结构。首先,我们记录每个字符出现的次数,然后遍历字符串,对于每个字符,如果它在栈中已经存在,则跳过;如果不存在,则将其压入栈中,并更新字符出现的次数。当字符出现次数变为0时,从栈中移除。这样,我们可以得到一个没有重复字符的字符串。最后,将栈中的字符拼接起来,就得到了最终的结果。
/*
* @lc app=leetcode.cn id=722 lang=javascript
*
* [722] 去除重复字母
*/
// @lc code=start
function removeDuplicateLetters(s) {
const count = new Array(26).fill(0);
const stack = [];
const seen = new Set();
for (const char of s) {
count[char.charCodeAt(0) - 'a'.charCodeAt(0)]++;
}
for (const char of s) {
count[char.charCodeAt(0) - 'a'.charCodeAt(0)]--;
if (!seen.has(char)) {
seen.add(char);
while (stack.length && char < stack[stack.length - 1] && count[stack[stack.length - 1].charCodeAt(0) - 'a'.charCodeAt(0)] > 0) {
seen.delete(stack.pop());
}
stack.push(char);
}
}
return stack.join('');
}
// @lc code=end