📅  最后修改于: 2023-12-03 15:42:01.006000             🧑  作者: Mango
题目描述:
给定一个字符串 s,将其中的重复字符去除,使得结果字符串的字典序最小。例如,s = "bcabc",去重后结果为 "abc",字典序最小。
解题思路:
使用栈来去重。从左向右遍历字符串 s,如果当前字符不在栈中,就将其压入栈中,否则跳过。当遇到栈顶元素大于当前字符的时候,说明可以将栈顶元素弹出,直到栈为空或者栈顶元素小于等于当前字符为止。最后按照栈中元素的顺序将字符拼接起来就是字典序最小的字符串。
Python 代码实现:
def remove_duplicate(s: str) -> str:
stack = []
seen = set()
for i, c in enumerate(s):
while stack and stack[-1] > c and s.find(stack[-1], i) != -1:
seen.discard(stack.pop())
if c not in seen:
stack.append(c)
seen.add(c)
return ''.join(stack)
Java 代码实现:
public String removeDuplicate(String s) {
Stack<Character> stack = new Stack<>();
Set<Character> seen = new HashSet<>();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
while (!stack.isEmpty() && stack.peek() > c && s.indexOf(stack.peek(), i) != -1) {
seen.remove(stack.pop());
}
if (!seen.contains(c)) {
stack.push(c);
seen.add(c);
}
}
StringBuilder sb = new StringBuilder();
for (char c : stack) {
sb.append(c);
}
return sb.toString();
}
时间复杂度:O(n),其中 n 是字符串 s 的长度。
空间复杂度:O(n)。最坏情况下栈和哈希集合都需要存储所有字符。
总结:
本题的核心思路是使用栈来去重,同时使用哈希集合来存储已经遍历过的字符,以便于快速判断一个字符是否在栈中。时间复杂度是 O(n),空间复杂度是 O(n)。