首页 > 其他分享 >[LeetCode] 1370. Increasing Decreasing String 上升下降字符串

[LeetCode] 1370. Increasing Decreasing String 上升下降字符串

时间:2025-01-18 19:32:46浏览次数:1  
标签:字符 String res charCnt character 1370 result Increasing string


You are given a string s. Reorder the string using the following algorithm:

  1. Remove the smallest character from s and append it to the result.
  2. Remove the smallest character from s that is greater than the last appended character, and append it to the result.
  3. Repeat step 2 until no more characters can be removed.
  4. Remove the largest character from s and append it to the result.
  5. Remove the largest character from s that is smaller than the last appended character, and append it to the result.
  6. Repeat step 5 until no more characters can be removed.
  7. Repeat steps 1 through 6 until all characters from s have been removed.

If the smallest or largest character appears more than once, you may choose any occurrence to append to the result.

Return the resulting string after reordering s using this algorithm.

Example 1:

Input: s = "aaaabbbbcccc"
Output: "abccbaabccba"
Explanation: After steps 1, 2 and 3 of the first iteration, result = "abc"
After steps 4, 5 and 6 of the first iteration, result = "abccba"
First iteration is done. Now s = "aabbcc" and we go back to step 1
After steps 1, 2 and 3 of the second iteration, result = "abccbaabc"
After steps 4, 5 and 6 of the second iteration, result = "abccbaabccba"

Example 2:

Input: s = "rat"
Output: "art"
Explanation: The word "rat" becomes "art" after re-ordering it with the mentioned algorithm.

Constraints:

  • 1 <= s.length <= 500
  • s consists of only lowercase English letters.

这道题说是给了一个字符串s,让采取下面一系列的措施:

  1. 删除s中最小的字符并将其附加到结果中。
  2. 删除比上次附加的字符大的s中最小的字符,并将其附加到结果中。
  3. 重复步骤2,直到不能再删除任何字符。
  4. 删除s中最大的字符并将其附加到结果中。
  5. 删除比上次附加的字符小的s中最大的字符,并将其附加到结果中。
  6. 重复步骤5,直到不能再删除任何字符。
  7. 重复步骤1到6,直到所有字符从s中被删除。

那么实际上就是找每个状态下s中的最大或最小的字符以及其个数,所以就需要统计每个字符出现的次数,而且最好还要能很方便的知道最大最小的字符是什么。一般来说,如果只想统计每个字符出现的个数,会用 HashMap 来做,但是这道题明确说了需要知道最大和最小的字符,则就应该用 TreeMap 或者数组来做。这里用数组来做更方便一点,因为题目中限定了字符串s中只有 26 个小写字母,则用一个大小为 26 的数组来统计每个字母的出现次数即可,而遍历的方向就可以决定取最大或最小的字符。由于总体步骤是要循环执行的,所以最外层要套一个 while 循环,判定条件就是结果 res 的长度不等于原字符串s。

然后从头开始遍历统计字符个数的数组 charCnt,若某个字符个数自减1之后仍大于等于0,则说明该字符存在,并且是当前最大的字符,则将其加入结果 res 中,这样保证了每种字符只会取一个,这样一圈遍历下来步骤1至3就完成了。同理,从末尾往前遍历,若某个字符个数自减1之后仍大于等于0,则说明该字符存在,并且是当前最小的字符,则将其加入结果 res 中,这样保证了每种字符只会取一个,这样一圈遍历下来步骤4至6就完成了。同时最外层的循环保证了步骤1至6可以重复执行,最终循环退出后就得到符合要求的结果 res,参见代码如下:


class Solution {
public:
    string sortString(string s) {
        string res;
        vector<int> charCnt(26);
        for (char c : s) {
            ++charCnt[c - 'a'];
        }
        while (s.size() != res.size()) {
            for (int i = 0; i < 26; ++i) {
                if (--charCnt[i] >= 0) {
                    res += (i + 'a');
                }
            }
            for (int i = 25; i >= 0; --i) {
                if (--charCnt[i] >= 0) {
                    res += (i + 'a');
                }
            }
        }
        return res;
    }
};

Github 同步地址:

https://github.com/grandyang/leetcode/issues/1370


参考资料:

https://leetcode.com/problems/increasing-decreasing-string

https://leetcode.com/problems/increasing-decreasing-string/solutions/533002/c-counts/


LeetCode All in One 题目讲解汇总(持续更新中...)

标签:字符,String,res,charCnt,character,1370,result,Increasing,string
From: https://www.cnblogs.com/grandyang/p/18678738

相关文章

  • 详解Rust 中 String 和 str 的用途与区别
    文章目录1.基本定义1.1String1.2str2.存储位置与内存模型2.1String2.2str3.用法与区别4.使用场景4.1使用String的场景4.2使用str的场景5.String和str的关系6.代码示例分析6.1从&str创建String6.2从String获取&str6.3拼接字符串6.4静态......
  • String类及其衍生类的简单理解
    String类及其衍生类的简单理解StringString指的是字符串的类,在java中,它是不可以更改的。1.下面简单介绍两种构造方法。publicclasshaohaoxuexi{publicstaticvoidmain(String[]args){Stringa=newString();Stringb="abc";}}这是两......
  • Java中String类常用的各种方法
    Java中String类常见的方法以下介绍字符串常见的几个方法。介绍String类在Java中,String类是一个代表字符串的类,具有以下特性:不可变性:String对象一旦被创建就是不可变的,即它们的值在创建后不能被更改。任何对String对象的修改操作实际上会创建一个新的String对象。......
  • JSON.stringify有什么局限性和哪些技巧?
    JSON.stringify是JavaScript中用于将对象转换为JSON字符串的方法,但它在某些情况下具有局限性,同时也有一些技巧可以帮助开发者更有效地使用它。以下是关于JSON.stringify的局限性和技巧的详细解答:局限性:循环引用问题:当对象之间存在循环引用时,JSON.stringify会抛出错误。例如,一......
  • 在C++中std::string 和string有啥区别呀?
    在C++中,std::string和string实际上是同一个类型,只是它们的命名空间(namespace)不同。具体来说:(我说为啥在写代码的时候都有个usingnamespacestd;语句我还以为是闹着玩.)std::string明确指定了string类型位于std命名空间中。string是std::string的简写,但要使......
  • 【YashanDB知识库】导入数据时报错:YAS-00008 type convert error:literal does not mat
    本文内容来自YashanDB官网,原文内容请见https://www.yashandb.com/newsinfo/7901522.html?templateId=1718516现象将数据通过SQL语气导入崖山时报错:YAS-00008typeconverterror:literaldoesnotmatchformatstring原因插入日期类型的字符串,不是配置参数DATE_FORMAT所指......
  • 宽窄字节4:CString的方便之处及优缺点
    文章目录前言一、CString类的方便之处二、使用方式1.CString类型的一些内置成员函数。2.CString对于TCHAR的封装3.CString类对于宽窄字节的转换4.CString类的优缺点总结前言宽窄字节4:CString的方便之处及优缺点。一、CString类的方便之处CString类归属于ATL,在MF......
  • 【轻松掌握数据结构与算法】字符串算法(String Algorithms)
    字符串算法概述字符串匹配算法是计算机科学中的一个重要领域,主要用于在文本中查找特定模式(子字符串)的出现位置。这些算法在文本编辑器、搜索引擎、生物信息学等领域有广泛的应用。暴力法(BruteForceMethod)暴力法是最直接的字符串匹配算法,它通过逐个字符比较来查找模式在文......
  • idea中,在pom文件引入jwt使用,JwtTes测试报错Cannot resolve method ‘withClaim(String
    JwtTes测试类中报错Cannotresolvemethod'withClaim(String,Map<String,Object>)'  1.报错报这个错误可能是jwt版本问题,下面请看我的报错文件JwtTest.javapom.xml找了好一会,以为是没加分号的原因,以为是用了中文标点,结果检查了一遍,代码没有问题,标点没有问题。......
  • 源码分析之Openlayers中CanvasLineStringBuilder类
    访问Openlayers网站(https://jinuss.github.io/Openlayers_map_pages/,网站是基于Vue3+Openlayers,里面有大量的实践和案例。觉得还不错,可以给个小星星Star,鼓励一波https://github.com/Jinuss/OpenlayersMap哦~概述在Openlayers中,CanvasLineStringBuilder类用于构建......