描述
给定一个字符串 s ,请你去除字符串中重复的字母(剩下的字符串中每个字符仅出现一次),并在不改变其相对位置的情况下使剩下的字符串字典序最小。
数据范围:字符串长度满足1≤n≤10 ^5 , 字符串中仅出现小写英文字母
示例1
输入:"abcd"
返回值:"abcd"
示例2
输入:"acbcd"
返回值:"abcd"
利用栈的方式保存。当该值小于栈顶值【表明不是最小字典序】,且后面还有该栈顶值,可以弹出该栈顶值
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param str string字符串
* @return string字符串
*/
public String removeDuplicateLetters (String str) {
// write code here
Stack<Character> stack = new Stack<>();
for(int i = 0; i<str.length();i++){
if(stack.contains(str.charAt(i))) continue;
// 如果栈顶大于当前字母,且从当前到后面还有该栈顶字母,则弹出该栈顶字母【该栈顶值一定会在后面】
while(!stack.isEmpty() && stack.peek()>str.charAt(i) && str.indexOf(stack.peek(),i)>0) stack.pop();
stack.add(str.charAt(i));
}
StringBuilder sb = new StringBuilder();
while(!stack.isEmpty()){
sb.append(stack.pop());
}
return sb.reverse().toString();
}
}