首页 > 其他 > 详细

上升下降字符串

时间:2020-11-25 15:16:16      阅读:52      评论:0      收藏:0      [点我收藏+]

题目描述

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

  1. 从 s 中选出最小的字符,将它接在结果字符串的后面
  2. 从 s 剩余字符中选出最小的字符,且该字符比上一个添加的字符大,将它接在结果字符串后面
  3. 重复步骤 2 ,直到你没法从 s 中选择字符
  4. 从 s 中选出最大的字符,将它接在结果字符串的后面
  5. 从 s 剩余字符中选出最大的字符,且该字符比上一个添加的字符小,将它接在结果字符串后面
  6. 重复步骤 5 ,直到你没法从 s 中选择字符
  7. 重复步骤 1 到 6 ,直到 s 中所有字符都已经被选过

在任何一步中,如果最小或者最大字符不止一个 ,你可以选择其中任意一个,并将其添加到结果字符串。

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


解题思路

我们可以直接创建一个大小为 26 的桶,记录每种字符的数量。然后重复若干轮下述操作,直到答案字符串的长度与传入的字符串的长度相等,这样就可以构造出这个字符串:

  1. 正序遍历桶,从未被选择的字符中提取出最长的上升字符串,将其加入答案,对应桶的计数减一
  2. 逆序遍历桶,从未被选择的字符中提取出最长的下降字符串,将其加入答案,对应桶的计数减一
class Solution {
    public String sortString(String s) {
        int[] nums = new int[26];
        for(int i = 0; i < s.length(); i++) {
            nums[s.charAt(i) - ‘a‘]++;
        }
        StringBuilder sb = new StringBuilder();
        while(sb.length() < s.length()) {
            for(int i = 0; i < nums.length; i++) {
                if(nums[i] > 0) {
                    sb.append((char)(i + ‘a‘));
                    nums[i]--;
                }
            }
            for(int i = nums.length - 1; i >= 0; i--) {
                if(nums[i] > 0) {
                    sb.append((char)(i + ‘a‘));
                    nums[i]--;
                }
            }
        }
        return sb.toString();
    }
}

上升下降字符串

原文:https://www.cnblogs.com/Yee-Q/p/14035762.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!