自定义字符串排序

简介: 自定义字符串排序

说在前面

🎈不知道大家对于算法的学习是一个怎样的心态呢?为了面试还是因为兴趣?不管是出于什么原因,算法学习需要持续保持。

一、题目描述

给定两个字符串 order 和 s 。order 的所有单词都是 唯一 的,并且以前按照一些自定义的顺序排序。

对 s 的字符进行置换,使其与排序的 order 相匹配。更具体地说,如果在 order 中的字符 x 出现字符 y 之前,那么在排列后的字符串中, x 也应该出现在 y 之前。

返回 满足这个性质的 s 的任意排列 。

示例 1:

输入: order = "cba", s = "abcd"
输出: "cbad"
解释: 
“a”、“b”、“c”是按顺序出现的,所以“a”、“b”、“c”的顺序应该是“c”、“b”、“a”。
因为“d”不是按顺序出现的,所以它可以在返回的字符串中的任何位置。“dcba”、“cdba”、“cbda”也是有效的输出。

示例 2:

输入: order = "cbafg", s = "abcd"
输出: "cbad"

提示:

1 <= order.length <= 26
1 <= s.length <= 200
order 和 s 由小写英文字母组成
order 中的所有字符都 不同

二、思路分析

字符串排序其实是很常见的问题,在平时的工作中我们也经常会遇到需要自定义的排序规则的相关需求功能实现。

这道题目的题意是说,我们需要按题目给出的order字符串中的字符排序优先进行排序,未在order中出现的字符串需要排在后面,即我们需要将目标字符串s中包含于order字符串中的字符优先排序,后面再将其他字符拼接到最后,具体思路如下:

  • 统计字符串s中每一个字符出现的次数
for(let i = 0; i < s.length; i++){
    map[s[i]] ? map[s[i]] ++ : map[s[i]] = 1;
}
  • 优先排序order中的字符
for(let i = 0; i < order.length; i++){
    if(map[order[i]]){
        res += order[i].repeat(map[order[i]]);
        delete map[order[i]];
    }
}
  • 省下的字符按与按顺序拼接到最后
for(const k in map){
    res += k.repeat(map[k]);
}

三、AC代码

/**
 * @param {string} order
 * @param {string} s
 * @return {string}
 */
var customSortString = function(order, s) {
    let map = {};
    for(let i = 0; i < s.length; i++){
        map[s[i]] ? map[s[i]] ++ : map[s[i]] = 1;
    }
    let res = '';
    for(let i = 0; i < order.length; i++){
        if(map[order[i]]){
            res += order[i].repeat(map[order[i]]);
            delete map[order[i]];
        }
    }
    for(const k in map){
        res += k.repeat(map[k]);
    }
    return res;
};

公众号

关注公众号『前端也能这么有趣』,获取更多有趣内容。

说在后面

🎉 这里是 JYeontu,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打羽毛球 🏸 ,平时也喜欢写些东西,既为自己记录 📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解 🙇,写错的地方望指出,定会认真改进 😊,偶尔也会在自己的公众号『前端也能这么有趣』发一些比较有趣的文章,有兴趣的也可以关注下。在此谢谢大家的支持,我们下文再见 🙌。

目录
相关文章
|
存储 缓存 容灾
AIGC 商业化道路探索 - Stable Diffusion 商业化应用(下)
Stable Diffusion 应用到商业领域的案例越来越多,商用场景下的技术架构应当如何构建?本文基于阿里云近期的一个 Stable Diffusion 商业案例,对大规模底模切换、大量 LoRA 调优的场景提出一个商业场景适用的技术架构,并已实现部署交付,稳定运行。
|
机器学习/深度学习 网络协议 vr&ar
proteus仿真软件中芯片的命名规则与封装方法(详细版)
proteus仿真软件中芯片的命名规则与封装方法(详细版)
2043 0
|
8月前
|
网络协议 算法 Java
基于Reactor模型的高性能网络库之Tcpserver组件-上层调度器
TcpServer 是一个用于管理 TCP 连接的类,包含成员变量如事件循环(EventLoop)、连接池(ConnectionMap)和回调函数等。其主要功能包括监听新连接、设置线程池、启动服务器及处理连接事件。通过 Acceptor 接收新连接,并使用轮询算法将连接分配给子事件循环(subloop)进行读写操作。调用链从 start() 开始,经由线程池启动和 Acceptor 监听,最终由 TcpConnection 管理具体连接的事件处理。
277 2
|
6月前
|
存储 小程序 Java
热门小程序源码合集:微信抖音小程序源码支持PHP/Java/uni-app完整项目实践指南
小程序已成为企业获客与开发者创业的重要载体。本文详解PHP、Java、uni-app三大技术栈在电商、工具、服务类小程序中的源码应用,提供从开发到部署的全流程指南,并分享选型避坑与商业化落地策略,助力开发者高效构建稳定可扩展项目。
|
人工智能
开启歌词创作之门:写歌词的技巧和方法详解,妙笔生词AI智能写歌词软件
歌词创作是通往音乐灵魂深处的大门。本文介绍了一些实用技巧,如借助《妙笔生词智能写歌词软件》的AI功能,捕捉生活中的灵感,确定主题,合理安排歌词结构,运用生动的语言和修辞手法,确保韵律和节奏,帮助你轻松开启创作之旅。
|
存储 运维 分布式计算
HDFS 如何容错?
【8月更文挑战第31天】
763 0
|
微服务
微服务架构与单体架构:比较和对比
【8月更文挑战第22天】
1093 0
|
机器学习/深度学习 监控 算法
基于YOLOv8与ByteTrack的车辆检测追踪与流量计数系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标追踪、车辆检测追踪、过线计数、流量统计(1)
基于YOLOv8与ByteTrack的车辆检测追踪与流量计数系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标追踪、车辆检测追踪、过线计数、流量统计
|
机器学习/深度学习 算法
全连接层那些事(Fully Connected Layer)
全连接层那些事(Fully Connected Layer)
mysql-实战案例 (超详细版)
mysql-实战案例 (超详细版)

热门文章

最新文章