此博客链接:https://www.cnblogs.com/ping2yingshi/p/14162380.html
去除重复字母
题目链接:https://leetcode-cn.com/problems/remove-duplicate-letters/
题目
给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置)。
注意:该题与 1081 https://leetcode-cn.com/problems/smallest-subsequence-of-distinct-characters 相同
示例 1:
输入:s = "bcabc"
输出:"abc"
示例 2:
输入:s = "cbacdcbc"
输出:"acdb"
提示:
1 <= s.length <= 104
s 由小写英文字母组成
题解
前言
此题我瞅一眼,就想到华哥说的哈希表,本来就想着不做了,但是看看是中等难道,可能事情没有那么简单。
错误思路
按照惯例,这里把字母作为key,而个数记为value。然后对字符排序,即为结果。
正确思路
我把题目看错了,人家要求的是有序,还得按照字典序最小,看了一些题解,这题目,是使用栈来做,然后里面说有序,可以利用栈来去重,然后在比较栈顶字母是否比当前字母的字典数小,如果是小的话,就把栈顶元素出栈,把当前元素进栈,这样最后出栈的时候是小的先出栈。需要注意的是,在判断栈顶元素和当前字母大小时,需要判断当前字母后面时候还有和栈顶一样的字母。
代码
class Solution {
public String removeDuplicateLetters(String s) {
Stack<Character> stack=new Stack();
for(int i=0;i<s.length();i++)
{
char zimu=s.charAt(i);
if(stack.contains(zimu))
{
continue;
}
while(!stack.isEmpty()&&stack.peek()>zimu&&s.indexOf(zimu,s.length())!=-1)
{
stack.pop();
}
stack.push(zimu);
}
char[] res=new char[stack.size()];
for(int i=0;i<res.length;i++){
res[i]=stack.pop();
}
return new String(res);
}
}
结果
也不知道为啥输出不对,我自己走了一遍,下面案例输出的应该和标答一样呢。