删除多余的字符得到最小不重复字典序序列
删除多余的字符得到字典序最小的字符串
http://www.nowcoder.com/questionTerminal/611d16ddd5344bfdb76c22306247dcf3
首先统计各个字符出现的数目 int count[26]
标记数组表明结果中是否包含当前字符 bool visit[26]
对于新来的一个字符,如果已经在结果中那么跳过
如果不在结果中,那么需要判断结果末尾的元素是否需要弹出,条件为:
①末尾元素之后还存在剩余
②末尾元素的字典序比当前字符字典序大
待弹出一定的末尾元素后(或者不需要弹出),当前字符放入到结果中
int main(){ string s; cin>>s; int n = s.length(); bool visit[26]={false};//是否已经添加到最终字符串中 int count[26]={0};//计数 vector<char> res; for(int i=0;i<n;i++) count[s[i]-'a']++;//计数 for(int i=0;i<n;i++) { count[s[i]-'a']--;//删除 if(visit[s[i]-'a'])//已经访问过 { continue; } //如果没有访问过 while(res.size()>0 && count[res.back()-'a']>0 && res.back()>s[i]) { //如果比末尾的小 且末尾后面还有重复字符 那么末尾弹出 visit[res.back()-'a']=false; res.pop_back();// } //当前字符进入 res.push_back(s[i]); visit[s[i]-'a']=true; } for(auto i:res) cout<<i; }