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;      }  };