去除重复字母
问题描述 :
给你一个仅包含小写字母的字符串,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证返回结果的字典序最小(要求不能打乱其他字符的相对位置)。
示例 1:
输入: “bcabc”
输出: “abc”
示例 2:
输入: “cbacdcbc”
输出: “acdb”
输入说明 :
输入一个仅包含小写字母的字符串
输出说明 :
输出结果。首尾无多余空格或空行。
输入范例 :
cbacdcbc
输出范例:
acdb
#include<iostream>
#include<vector>
using namespace std;
string removeDuplicateLetters(string s){
vector<int> nums(126,0);//各个字母的个数
vector<bool> visited(126,false);//字母是否加入过 加入过就置为true
for(char c:s){//统计每个字母出现过的次数
nums[c]++;
}
string result;//最终结果
for(char c:s){
nums[c]--;//遍历s中每个字母 并将对应字母次数减一
if(visited[c]){//如果result中已存在 则直接跳过
continue;
}
while(result.back()>c&&nums[result.back()]){//如果result中最后一个比当前字母大(即像c>b)并且当前字母个数不为空 则将当前字母的visited置为false result最后一位退出
visited[result.back()]=false;
result.pop_back();
}
result=result+c;
visited[c]=true;//加入result就置为true
}
return result;
}
int main(){
string s;
cin>>s;
cout<<removeDuplicateLetters(s);
}