不能打乱相对顺序要按字典序
输入adbcd : 输出abcd
//单调栈
class Solution {
public String removeDuplicateLetters(String s) {
int len = s.length();
//1.特判
if(len < 2) return s;
//2.1用于判断字符是否已经出现过
boolean[] flag = new boolean[26];
//2.2字符后续时会出现
int[] nums = new int[26];
for(int i=0;i<len;i++)
nums[arrChar[i]-'a'] = i;
//2.3使用deque来做单调栈并存入哨兵a就无需判断栈是否为空
ArrayDeque<Character> deque = new ArrayDeque();
deque.add('a');
//2.4字符串转数组,因为charAt会判断字符串是否越界
char[] arrChar = s.toCharArray();
for(int i=0;i<len;i++)
{
char curChar = arrChar[i];
//3.1出现就跳过本次
if(flag[curChar-'a'])
continue;
//3.2当前小于之前并且之前的还会出现就弹出之前
while(curChar<deque.peekLast() && nums[deque.peekLast()-'a']>i)
{
char top = deque.pollLast();
flag[top-'a'] = false;
}
//3.3加入
deque.addLast(curChar);
flag[curChar-'a']=true;
}
//4,1删除哨兵
deque.pollFirst();
StringBuilder sb = new StringBuilder();
//4.2取出元素
while(!deque.isEmpty())
sb.append(deque.pollFirst());
return sb.toString();
}
}