java怎么去除重复字母

171 阅读1分钟

题目

给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置)

思路分析

要点1、要保证字典序最小,必须删除字符串头部的逆序对
要点2、同时删除重复的字符

java代码

class Solution {
    public String removeDuplicateLetters(String s){
        Stack<Character> stack = new Stack<>();
        for (int i = 0; i < s.length(); i++) {
            if (stack.contains(s.charAt(i))) {
                continue;
            }
            while(!stack.isEmpty() && stack.peek() > s.charAt(i) 
                    && s.indexOf(stack.peek(), i) != -1) {
                stack.pop();
            }
            stack.push(s.charAt(i));
        }

        StringBuffer sb = new StringBuffer();
        while (!stack.isEmpty()) {
            sb.append(stack.pop());
        }
        return sb.reverse().toString();
    }
}

分析

1.我在代码中使用了一个栈(Stack)来存储字符。然后循环该字符,依次将字母放入栈中。对于字符串s中的每个字符,如果该字符已经在栈中存在,则跳过它。否则,将该字符压入栈中。
2.如果栈顶字符比当前字符大,并且栈顶字符后面还有相同的字符,则将栈顶字符弹出,直到栈顶字符比当前字符小或者栈为空或者栈顶字符后面没有相同的字符。
3.创建一个StringBuffer对象,如果栈不为空,则将栈中的字母弹出,并且追加到后面。由于栈中先进后出的特性,需要将字母反转过来,就是我们所求的结果。