删除多余的字符得到最小不重复字典序序列
删除多余的字符得到字典序最小的字符串
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;
}