力扣(LeetCode)791. 自定义字符串排序(C++)

news/2024/5/19 21:47:54 标签: leetcode, c++, 算法, 计数排序, 快速排序

排序

这道题只关心 o r d e r order order 出现的字符,在 s s s 中的排序。 s s s 中不在 o r d e r order order 的字符,在排序后是什么位置,不影响答案。
可以用 s o r t sort sort 函数,传入我们自定义的排序方式,按照 o r d e r order order 中字母顺序排序。
更贴切的,可以用计数排序,统计 s s s 中每个字母出现次数 t i m e s times times。按照 o r d e r order order 的循序,和 t i m e s times times 的次数,依次将每个字母加入 a n s ans ans , 最后将剩余字符加入 a n s ans ans,即为所求。

代码展示

自定义排序
class Solution {
public:
    string customSortString(string order, string s) {
        //自定义字符串排序
        vector<int> cmp(26);
        for(int i = 0 ;i<order.size();i++){
            cmp[order[i]-'a'] = i+1;//每个字母的顺序
        }
        sort(s.begin(),s.end(),[&](char c0,char c1){//匿名表达式
            return cmp[c0-'a'] < cmp[c1-'a'];//自定义顺序
        });
        return s;
    }
};
计数排序
class Solution {
public:
    string customSortString(string order, string s) {
        //计数排序
        vector<int> times(26);
        for(auto x:s){//记录s中每个字母出现的次数
            times[x-'a'] ++;//每个字母的顺序
        }
        string ans;
        for(auto x:order){
            while(times[x-'a']>0){//ans+=string(times[x-'a'],x);
                ans+=x;
                times[x-'a']--;//time[x-'a'] = 0;
            }
        }
        for(int i = 0;i<26;i++){//剩余顺序无所谓,关键在于排序order
            ans+=string(times[i],i+'a');
            times[i] = 0;
        }
        // for(auto x:s){
        //     ans+=string(times[x-'a'],x);
        //     times[x-'a'] = 0;
        // }
        return ans;
    }
};

博主致语

理解思路很重要!
欢迎读者在评论区留言,作为日更博主,看到就会回复的。

AC

AC

复杂度分析

自定义排序
  1. 时间复杂度: O ( n l o g n + ∣ C ∣ ) O(nlogn + |C|) O(nlogn+C) n n n s s s 的长度, ∣ C ∣ = 26 |C|=26 C=26 是字母个数。快排 s s s 的时间复杂度 O ( n l o g n ) O(nlogn) O(nlogn) ,遍历 26 26 26 个字母的时间复杂度 O ( ∣ C ∣ ) O(|C|) O(C)
  2. 空间复杂度: O ( ∣ C ∣ ) O(|C|) O(C) c m p cmp cmp 数组的空间复杂度是 O ( ∣ C ∣ ) O(|C|) O(C)
计数排序
  1. 时间复杂度: O ( n + ∣ C ∣ ) O(n + |C|) O(n+C) n n n s s s 的长度, ∣ C ∣ = 26 |C|=26 C=26 是字母个数。一次遍历 s s s 并计数的时间复杂度 O ( n ) O(n) O(n) ,遍历 26 26 26 个字母的时间复杂度 O ( ∣ C ∣ ) O(|C|) O(C)
  2. 空间复杂度: O ( ∣ C ∣ ) O(|C|) O(C) t i m e s times times 数组的空间复杂度是 O ( ∣ C ∣ ) O(|C|) O(C)

http://www.niftyadmin.cn/n/5507.html

相关文章

multisim仿真 74LS148D芯片

multisim仿真 74LS148D芯片

Hibernate-Validator 接口参数校验 | 嵌套参数校验

0. 依赖&#xff1a;1. 常用注解&#xff1a;2. 全局异常处理&#xff1a;3. 使用场景&#xff1a;3.1. 接口参数列表校验&#xff1a;3.2. 实体类参数校验&#xff1a;3.2.1. 不包含嵌套属性的实体类参数校验&#xff1a;3.2.2. 包含嵌套属性的实体类参数校验&#xff1a;3.2.…

FusionCharts Suite XT 3.19.1-2022-07-22

FusionCharts Suite XT FusionCharts 可帮助您为 Web 和移动项目构建漂亮的仪表板。借助广泛的文档、跨浏览器支持和一致的 API&#xff0c;添加交互式和响应式图表比以往任何时候都容易。从简单的图表&#xff08;如折线图、柱形图和饼图&#xff09;到特定领域的图表&#xf…

JavaScript 中常用和必备的一些工具类函数

目录 1、判断是否为数值函数 isNumber 2、计算字符串长度 calculateStrLengh 3、转换日期格式 changeDateFormat 4、节流函数 throttle 5、防抖函数 debounce 6、获取地址栏参数 GetUrlParam 7、判断两个 Oject 是否相等 isEqualObject 8、判断 Object 是否为空 isEmp…

java毕业设计在线教学评比平台Mybatis+系统+数据库+调试部署

java毕业设计在线教学评比平台Mybatis系统数据库调试部署 java毕业设计在线教学评比平台Mybatis系统数据库调试部署本源码技术栈&#xff1a; 项目架构&#xff1a;B/S架构 开发语言&#xff1a;Java语言 开发软件&#xff1a;idea eclipse 前端技术&#xff1a;Layui、HTM…

初识数据结构

文章目录前言一、数据结构是什么&#xff1f;二、算法是什么&#xff1f;三、数据结构和算法的关系四、如何学好数据结构&#xff1f;五、学习数据结构该如何练习呢&#xff1f;总结前言 在学习了一定的C语言知识后&#xff0c;我们的学习就进入了下一个阶段——数据结构与算法…

Mybatis的增删改查操作

增删改查操作对于我们程序员来说是最基本也是最重要的操作.那么在Mybatis框架下如何对jdbc中的数据进行增删改查操作? 首先,在介绍之前,我们先来了解一下我们在进行增删改查操作过程中会遇到的各种属性和重要方法: 属性 1.namespace: 称为命名空间,用来将dao与Mapper进行绑…

【Java 实战】通过Redis实现购物车功能

项目场景&#xff1a; 通过Redis实现购物车&#xff0c;包括添加购物车、更新商品数量、删除购物车、结算验证库存等功能。 设计思路 1.数据存储 对于购物车&#xff0c;我们在Redis中需要存储的是用户和商品信息&#xff0c;数据结构类似于Java中Map<String,Map<Str…