• 上升下降字符串


    给你一个字符串 s ,请你根据下面的算法重新构造字符串:

      (1)从 s 中选出 最小 的字符,将它 接在 结果字符串的后面。
      (2)从 s 剩余字符中选出 最小 的字符,且该字符比上一个添加的字符大,将它 接在 结果字符串后面。
      (3)重复步骤 2 ,直到你没法从 s 中选择字符。
      (4)从 s 中选出 最大 的字符,将它 接在 结果字符串的后面。
      (5)从 s 剩余字符中选出 最大 的字符,且该字符比上一个添加的字符小,将它 接在 结果字符串后面。
      (6)重复步骤 5 ,直到你没法从 s 中选择字符。
      (7)重复步骤 1 到 6 ,直到 s 中所有字符都已经被选过。
      (8)在任何一步中,如果最小或者最大字符不止一个 ,你可以选择其中任意一个,并将其添加到结果字符串。

      请你返回将 s 中字符重新排序后的 结果字符串 。

     

    示例 1:

    输入:s = "aaaabbbbcccc"
    输出:"abccbaabccba"
    解释:第一轮的步骤 1,2,3 后,结果字符串为 result = "abc"
    第一轮的步骤 4,5,6 后,结果字符串为 result = "abccba"
    第一轮结束,现在 s = "aabbcc" ,我们再次回到步骤 1
    第二轮的步骤 1,2,3 后,结果字符串为 result = "abccbaabc"
    第二轮的步骤 4,5,6 后,结果字符串为 result = "abccbaabccba"
    示例 2:

    输入:s = "rat"
    输出:"art"
    解释:单词 "rat" 在上述算法重排序以后变成 "art"
    示例 3:

    输入:s = "leetcode"
    输出:"cdelotee"
    示例 4:

    输入:s = "ggggggg"
    输出:"ggggggg"
    示例 5:

    输入:s = "spo"
    输出:"ops"
     

    提示:

    1 <= s.length <= 500
    s 只包含小写英文字母。

    思路:

    方法一:桶记数
    思路

      我们可以开一个长度为 26 的数组表示 26 个桶,每个桶里存放一种字母。先用 O(|s|) 的时间扫描一遍字符串(其中 |s| 代表字符串的长度),统计每个字母出现的次数。然后我们只要不停地扫描这里的「桶序列」——先从小到大扫,再从大到小扫,每次发现一个桶当中计数值不为 0 的时候,就把这个桶对应的字母添加到结果字符串的最后方,然后对计数值减一。

    具体地,开一个长度为 26 的数组 h[],作为用来计数的「桶」。

    代码:

     1 #include<iostream>
     2 #include<cstring>
     3 using namespace std;
     4 int h[26];
     5 string sortString(string s){
     6     int j=0;
     7     while(s[j])
     8         ++h[s[j++]-'a'];   //计算每个字符出现的次数
     9     string ans;
    10     int n =0,len = s.length();
    11     while (n<len)
    12     {
    13         for (int i = 0; i < 26; i++)//从小到大
    14             if (h[i]){
    15                 ans.push_back(i+'a');
    16                 h[i]--;
    17                 n++;
    18             }
    19         for(int i=25;i>=0;i--)//从大到小
    20             if(h[i]){
    21                 ans.push_back(i+'a');
    22                 h[i]--;
    23                 n++;
    24             }    
    25     }
    26     return ans;
    27 }
    28 int main(){
    29     string s;
    30     cin>>s;
    31     cout<<sortString(s);
    32 }

     

    因上求缘,果上努力~~~~ 作者:每天卷学习,转载请注明原文链接:https://www.cnblogs.com/BlairGrowing/p/12799564.html

  • 相关阅读:
    Java实现 蓝桥杯 生命游戏
    Java实现 蓝桥杯 生命游戏
    Java实现UVA10131越大越聪明(蓝桥杯每周一题)
    Linux 静态库&动态库调用
    linux下c++开发环境安装(eclipse+cdt)
    怎样在Windows和Linux下写相同的代码
    教会你如何编写makefile文件
    Linux编译多个不同目录下的文件以及静态库、动态库的使用
    Fedora 17 下安装codeblocks
    Fedora 下安装codeblocks
  • 原文地址:https://www.cnblogs.com/BlairGrowing/p/12799564.html
Copyright © 2020-2023  润新知