📌  相关文章
📜  通过删除重复项形成的字典序最小字符串(1)

📅  最后修改于: 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)。