2.問題解決のアイデア
- 直感的な考え方は次のとおりです。整然としたマップ<文字、整数>文字と文字が表示されますのレコード番号
- タイトルに記載の方法において、一次トラバーサルマップ、発生するまで、マップ内のすべての文字まで、回数を逆の順序トラバーサルをマッピング0
3.アルゴリズム
- マップ<文字、整数>の順トラバーサル文字列s、記録文字と文字の数が表示されます
- 順方向電流を示すフラグを設定すると、順方向マップ、又は逆トラバースマップをトラバースされます
- そうでない場合、Xは0である文字の発生数が、文字があったことを示し、文字Xの出現数は、0でないならば、文字列、文字とマイナスの出現回数に加算結果は、地図を横切りますこれは、トラバースされており、結果文字列に追加されました。
- 実際に終了条件があることがあります:文字の結果、マップの完全な横断後、手紙のすべての出現が0であれば、あなたはループを終了し、結果の文字列(PSを返すことができ、文字列全体がオーバートラバースされています表し元の文字列の長さと同じ長さの文字列が、)ループを終了することができます
実装4.
class Solution {
public:
string sortString(string s) {
map<char, int> table;
for(auto c : s){
table[c] = table[c] + 1;
}
string res;
bool forward = 1;
while(table.size() != 0){
bool finish = true;
if(forward){
map<char, int>::iterator begin = table.begin();
map<char, int>::iterator end = table.end();
forward = 0;
for(; begin != end; begin++){
if(begin->second == 0){
continue;
}
finish = false;
res += begin->first;
begin->second = begin->second - 1;
}
}else{
map<char, int>::reverse_iterator begin = table.rbegin();
map<char, int>::reverse_iterator end = table.rend();
forward = 1;
for(; begin != end; begin++){
if(begin->second == 0){
continue;
}
finish = false;
res += begin->first;
begin->second = begin->second - 1;
}
}
if(finish)
break;
//if(res.size() == s.size()) //另一种退出条件
// break;
}
return res;
}
};
//巧妙解法
//该解法有个限制条件:s中出现的字符排序规则必须跟map对这些字符的排序规则保持一致
class Solution {
public:
string sortString(string s) {
string ans;
map<char,int > cnt;
for(auto item:s)cnt[item]++;
while(1){
for(char ch='a';ch<='z';++ch)
if(cnt[ch]!=0)cnt[ch]--,ans.push_back(ch);
for(char ch='z';ch>='a';--ch)
if(cnt[ch]!=0)cnt[ch]--,ans.push_back(ch);
if(ans.size()==s.size())break;
}
return ans;
}
};