題目:
/*** 思路:棧,使用數組記錄每個字母出現的次數,再用一個數組標記字符是否在棧中* 遍歷棧,存儲字符時比較棧頂字符,若小于棧頂字符并且后面有重復的字符則* 棧頂元素出棧,否則入棧。** @auther start* @create 2023-11-23 21:50*/
public class L1081 {public String removeDuplicateLetters(String s) {char[] chars = s.toCharArray();int[] left = new int[26];//標記字符是否在結果中boolean[] inAns = new boolean[26];//記錄字符出現的次數for (char c : chars) {left[c - 'a']++;}//存放結果
// StringBuilder ans = new StringBuilder(26);Deque<Character> ans = new LinkedList<>();//遍歷字符串for (char c : chars) {left[c - 'a']--;//保證結果中沒有重復字母if (inAns[c - 'a'])continue;//當前字符比前一個字符小,并且前一個字符后面有重復的, 則從結果中去除前一個字符。while (!ans.isEmpty() && c < ans.peek() && left[ans.peek() - 'a'] > 0) {//將前一個字符標為false,表示結果中沒有該字符inAns[ans.peek() - 'a'] = false;//刪除前一個字符ans.pop();}//添加字符到結果中ans.push(c);//表示存在inAns[c - 'a'] = true;}StringBuilder sb = new StringBuilder();int n = ans.size();for (int i = 0; i < n; i++) {sb.insert(0,ans.pop());}return sb.toString();}
}