给定一个仅包含小写字母的字符串,去除字符串中重复的字母,使得每个字母只出现一次。需保证返回结果的字典序最小(要求不能打乱其他字符的相对位置)。
示例 1:
输入: “bcabc”
输出: “abc”
示例 2:
输入: “cbacdcbc”
输出: “acdb”
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-duplicate-letters
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
/*
* 采用栈
* 1、当前元素>栈顶元素 直接压入
* 2、当前元素<栈顶元素,查看后面还有没有栈顶元素,如果有,弹出栈顶元素,压入当前元素
*/
public String removeDuplicateLetters(String s) {
int len = s.length();
if(len<2) return s;
int[] lastIndex = new int[26];//存储单词出现的最后位置,未出现置为-1
Arrays.fill(lastIndex,-1);
for(int i=0;i<len;i++){
char ch = s.charAt(i);
lastIndex[ch-'a'] = i;
}
Set<Character> set = new HashSet<Character>();//存储当前栈中的元素
Stack<Character> stack = new Stack<Character>();
for(int i=0;i<len;i++){
char ch = s.charAt(i);
if(set.contains(ch)) continue;
while(!stack.isEmpty() && stack.peek()>ch && lastIndex[stack.peek()-'a']>=i){
Character temp = stack.pop();
set.remove(temp);
}
stack.push(ch);
set.add(ch);
}
StringBuilder stringBuilder = new StringBuilder();
while (!stack.empty()) {
stringBuilder.insert(0, stack.pop());
}
return stringBuilder.toString();
}
}