打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
上升下降字符串

题目描述

给你一个字符串 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();
    }
}

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
小红书19面试题总结(错题整理)
动态规划常见实例详解
C#字符串截取,字符串分割
给定一字符数组,求数组中字符组成的所有排列? - Java / Java SE
C#把字符数组转换成含有分隔符的字符串(5-3-4-2-5-5)
java中字符窜与16进制,byte之间的转换
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服