zoukankan      html  css  js  c++  java
  • 上升下降字符串

    给你一个字符串 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

  • 相关阅读:
    Single Number II
    Pascal's Triangle
    Remove Duplicates from Sorted Array
    Populating Next Right Pointers in Each Node
    Minimum Depth of Binary Tree
    Unique Paths
    Sort Colors
    Swap Nodes in Pairs
    Merge Two Sorted Lists
    Climbing Stairs
  • 原文地址:https://www.cnblogs.com/BlairGrowing/p/12799564.html
Copyright © 2011-2022 走看看