question
Given a string which contains only lowercase letters, remove duplicate letters so that every letter appear once and only once. You must make sure your result is the smallest in lexicographical order among all possible results.
Example:
Given “bcabc”
Return “abc”
Given “cbacdcbc”
Return “acdb”
solution
//用数组标记字符出现的次数 用数组标记字符是否被访问(代表是否已经找到最优值)
//用栈保存结果 当有新的字符入栈时 判断在栈中的比入栈字符大的 是否在栈后出现 若是则出栈 以此循环 可得到结果
code
public static String removeDuplicateLetters(String s) {
Stack<Character> stack=new Stack<Character>();
int []res=new int[26];
boolean [] visited=new boolean[26];
int len=s.length();
for(int i=0; i<len; ++i)
{
res[s.charAt(i)-'a']++;
}
for(char ch:s.toCharArray())
{
//System.out.println("ch: "+ch);
res[ch-'a']--;
if(visited[ch-'a'])
continue;
while(!stack.isEmpty() && stack.peek() > ch && res[stack.peek()-'a']!=0 )
{
visited[stack.pop()-'a']=false;
}
stack.push(ch);
//System.out.println("push: "+ch);
visited[ch-'a']=true;
}
StringBuilder sb = new StringBuilder();
while(!stack.isEmpty())
{
sb.insert(0,stack.pop());
}
return sb.toString();
}