LeetCode 316. Remove Duplicate Letters(貪心)
- 2020 年 3 月 17 日
- 筆記
題意:刪除重複的字元,得到字典序最小的結果字元串
題解:貪心,咱們從結果字元串的左邊開始,左邊第一個字元在原字元串中的右邊一定有n-1個不同的字元,這裡n就是結果字元串的長度。 所以我們每次遍曆數組,找到右邊有n-1個不同字元的字元,並選擇最小的那個。 由於最多26個字母,最多遍歷26次,所以不會超時 注意,要標記字元串是否被刪除過。
class Solution { public: int vis[30]; int m[30]; string ans; int res; int b=-1; string removeDuplicateLetters(string s) { if(s=="") return ""; memset(vis,0,sizeof(vis)); int pos = 0; while(1) { pos = fun(s,pos); ans+=(res+'a'); vis[res]=1; if(ans.length()==b) break; } return ans; } int fun(string s,int pos) { memset(m,0,sizeof(m)); int x=0; res = 31; int j=-2; for(int i=s.length()-1;i>=pos;i--) { if(vis[s[i]-'a']==1) continue; if(m[s[i]-'a']==0) { x++; m[s[i]-'a']=1; res = s[i]-'a'; j=i; } else { if(res>=s[i]-'a') { res=s[i]-'a'; j=i; } } } if(b == -1) b=x; return j+1; } };