-
LeetCode316 去除重复字母
-
思路分析
-
题意分析
- 去除重复字母
- 不打乱字母相对位置:如示例2中为acdb,不能为abcd
- 字典序最小:bca不行,应该为abc
-
解题思路
-
使用栈,即单调栈来实现要求1和2,使用boolean[] inStack记录栈中元素达到去重目的
使用栈的原因:利用栈的先进后出特性,我们可以立即操作刚插入的字符
-
当要压栈的元素比栈顶元素小时,弹出栈顶元素,达到
-
2有两种情况
- 如果stk.peek()这个字符还会出现,则可以pop
- 如果stk.peek()这个字符不再出现,则不能pop
因此需要使用int[] count在最初记录每个字符的个数,在pop前判断栈顶字符是否唯一
-
最后pop出的所有元素要reverse
-
-
-
代码实现
class Solution { public String removeDuplicateLetters(String s) { Stack<Character> stk = new Stack<>(); //因为是ascii码,因此128足够 boolean[] inStack = new boolean[128]; int[] count = new int[128]; //统计各字符的个数 for (char c : s.toCharArray()) { count[c]++; } for (char c : s.toCharArray()) { count[c]--; //如果已经在stack中则continue if (inStack[c]) { continue; } //如果栈不为空且栈顶元素大于c while (!stk.isEmpty() && stk.peek() > c) { //如果后面没有栈顶元素 if (count[stk.peek()] == 0) { break; } inStack[stk.pop()] = false; } stk.push(c); inStack[c] = true; } StringBuilder sb = new StringBuilder(); while (!stk.isEmpty()) { sb.append(stk.pop()); } return sb.reverse().toString(); } }
-
LeetCode316 去除重复字母
最新推荐文章于 2024-07-20 23:08:39 发布