Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情。

一、题目描述

给定两个字符串 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;
};