[LeetCode] 1370文字列を増減

1.オリジナルタイトルリンク:https://leetcode.com/problems/increasing-decreasing-string/

2.問題解決のアイデア

  1. 直感的な考え方は次のとおりです。整然としたマップ<文字、整数>文字と文字が表示されますのレコード番号
  2. タイトルに記載の方法において、一次トラバーサルマップ、発生するまで、マップ内のすべての文字まで、回数を逆の順序トラバーサルをマッピング0

3.アルゴリズム

  1. マップ<文字、整数>の順トラバーサル文字列s、記録文字と文字の数が表示されます
  2. 順方向電流を示すフラグを設定すると、順方向マップ、又は逆トラバースマップをトラバースされます
  3. そうでない場合、Xは0である文字の発生数が、文字があったことを示し、文字Xの出現数は、0でないならば、文字列、文字とマイナスの出現回数に加算結果は、地図を横切りますこれは、トラバースされており、結果文字列に追加されました。
  4. 実際に終了条件があることがあります:文字の結果、マップの完全な横断後、手紙のすべての出現が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;
    }
};

おすすめ

転載: www.cnblogs.com/wengle520/p/12444516.html