• 791. 自定义字符串排序 : 简单构造题


    题目描述

    这是 LeetCode 上的 791. 自定义字符串排序 ,难度为 中等

    Tag : 「构造」、「模拟」

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

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

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

    示例 1:

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

    示例 2:

    1. 输入: order = "cbafg", s = "abcd"
    2. 输出: "cbad"
    3. 复制代码

    提示:

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

    构造

    根据题意进行模拟即可:起始先使用大小为 C = 26C=26 的数组 cnts 对 s 的所有字符进行词频统计,随后根据 order 的优先级进行构造。

    若字符 x 在 order 中排于 y 前面,则先往答案追加 cnts[x] 个字符 x,再往答案追加 cnts[y] 个字符 y,并更新对应词频,最后将仅出现在 s 中的字符追加到答案尾部。

    Java 代码:

    1. class Solution {
    2. public String customSortString(String order, String s) {
    3. int[] cnts = new int[26];
    4. for (char c : s.toCharArray()) cnts[c - 'a']++;
    5. StringBuilder sb = new StringBuilder();
    6. for (char c : order.toCharArray()) {
    7. while (cnts[c - 'a']-- > 0) sb.append(c);
    8. }
    9. for (int i = 0; i < 26; i++) {
    10. while (cnts[i]-- > 0) sb.append((char)(i + 'a'));
    11. }
    12. return sb.toString();
    13. }
    14. }
    15. 复制代码

    TypeScript 代码:

    1. function customSortString(order: string, s: string): string {
    2. const cnts = new Array<number>(26).fill(0)
    3. for (const c of s) cnts[c.charCodeAt(0) - 'a'.charCodeAt(0)]++
    4. let ans = ''
    5. for (const c of order) {
    6. while (cnts[c.charCodeAt(0) - 'a'.charCodeAt(0)]-- > 0) ans += c
    7. }
    8. for (let i = 0; i < 26; i++) {
    9. while (cnts[i]-- > 0) ans += String.fromCharCode(i + 'a'.charCodeAt(0));
    10. }
    11. return ans
    12. }
    13. 复制代码

    Python 代码:

    1. class Solution:
    2. def customSortString(self, order: str, s: str) -> str:
    3. cnts = [0] * 26
    4. for c in s:
    5. cnts[ord(c) - ord('a')] += 1
    6. ans = ''
    7. for c in order:
    8. num = ord(c) - ord('a')
    9. if cnts[num] > 0:
    10. ans += c * cnts[num]
    11. cnts[num] = 0
    12. for i in range(26):
    13. if cnts[i] > 0:
    14. ans += chr(i + ord('a')) * cnts[i]
    15. return ans
    16. 复制代码
    • 时间复杂度:O(n + m)O(n+m)
    • 空间复杂度:O(C)O(C),其中 C = 26C=26 为字符集大小

    最后

    这是我们「刷穿 LeetCode」系列文章的第 No.791 篇,系列开始于 2021/01/01,截止于起始日 LeetCode 上共有 1916 道题目,部分是有锁题,我们将先把所有不带锁的题目刷完。

    在这个系列文章里面,除了讲解解题思路以外,还会尽可能给出最为简洁的代码。如果涉及通解还会相应的代码模板。

    在仓库地址里,你可以看到系列文章的题解链接、系列文章的相应代码、LeetCode 原题链接和其他优选题解。

     

  • 相关阅读:
    Linux配置SSH允许TCP转发
    落户中国云都,智算中心挑起区域发展的大梁
    Mybatis学习|Mybatis缓存:一级缓存、二级缓存
    每日三题 9.07
    k8s部署rook ceph
    Vue项目中,Async与Await设置多个Axios异步请求的执行顺序
    基于SpringBoot+Vue+uniapp微信小程序的学生实习与就业管理系统的详细设计和实现
    iOS 内存泄漏问题总结
    【Python测试开发】断言
    Nginx安装
  • 原文地址:https://blog.csdn.net/BASK2311/article/details/127843289