说在前面
🎈不知道大家对于算法的学习是一个怎样的心态呢?为了面试还是因为兴趣?不管是出于什么原因,算法学习需要持续保持。
一、题目描述
给定两个字符串 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,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打羽毛球 🏸 ,平时也喜欢写些东西,既为自己记录 📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解 🙇,写错的地方望指出,定会认真改进 😊,偶尔也会在自己的公众号『
前端也能这么有趣
』发一些比较有趣的文章,有兴趣的也可以关注下。在此谢谢大家的支持,我们下文再见 🙌。