20.12.21 leetcode316

题目链接:https://leetcode-cn.com/problems/remove-duplicate-letters/

题意:给你一个字符串,要求每种字母最多只出现一次,求字典序最小。

分析:用栈来做,从前往后遍历,如果之前没出现过,就加进栈里面,同时遍历到每个字符时都要和当前栈顶的元素做比较,如果栈顶元素比当前元素大,并且栈顶元素之后还能遇到,就把栈顶元素给去掉,这里因为限制了每个字母都要出现一次,加上了vis和num数组来进行优化。

 1 class Solution {
 2     public String removeDuplicateLetters(String s) {
 3         boolean[] vis = new boolean[26];
 4         int[] num = new int[26];
 5         for(int i=0;i<s.length();i++){
 6             num[s.charAt(i)-'a']++;
 7         }
 8         StringBuffer sb = new StringBuffer();
 9         for(int i=0;i<s.length();i++){
10             char c=s.charAt(i);
11             if(!vis[c-'a']){
12                 while(sb.length()>0&&sb.charAt(sb.length()-1)>c){
13                     if(num[sb.charAt(sb.length()-1)-'a']>0){
14                         vis[sb.charAt(sb.length()-1)-'a']=false;
15                         sb.deleteCharAt(sb.length()-1);
16                     }else{
17                         break;
18                     }
19                 }
20                 vis[c-'a']=true;
21                 sb.append(c);
22             }
23             num[c-'a']--;
24         }
25         return sb.toString();
26     }
27 }
原文地址:https://www.cnblogs.com/qingjiuling/p/14166875.html