题目重点:按给定字符优先序重排字符串,保留每个字符的出现次数,并明确未列字符顺序。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- order字符互不重复,只约束这些字符的相对优先顺序;text可含其他字符。
- 训练把未指定字符放末尾并保留它们原相对顺序。实际题若允许任意次序,这个稳定策略仍合法;若需要放开头则调整规则。
解题路线
- 统计text频次,按order逐字符输出count份;再扫描原text,只输出不在order的字符。
- 未指定字符二次扫原文而非扫Counter,确保它们的相对位置稳定;指定字符之间的数量来自freq。
- 字符串拼接用列表/join,避免不断追加造成重复分配;即使字母表小,也不能只输出存在与否而丢重复。
手动走一遍
order=cba,text=abcdabx,计数c1/b2/a2,前半cbbaa;剩余dx原序,结果cbbaadx。
Python 参考实现
下面的代码按上文假设实现,适合本地运行并追加自己的测试用例。
代码区可横向滚动;使用键盘时,先聚焦代码区再按方向键查看。
from collections import Counter
def custom_sort_string(order, text):
"""Order characters are distinct; unspecified characters retain original relative order."""
if len(set(order)) != len(order):
raise ValueError('order characters must be distinct')
counts=Counter(text)
ranked=set(order)
return ''.join(char*counts[char] for char in order)+''.join(char for char in text if char not in ranked)
复杂度
O(|order|+|text|)预期时间,O(U)频次数加O(n)输出,U为text不同字符数。
易错点与追问
容易失分的边界
- order里重复字符会重复输出整组,因此明确拒绝重复优先项。
- 按text原字典序sort会忽略给定优先序;需要rank映射或计数。
继续深挖
- 若未指定字符也要字典序,末尾排序额外O(U log U)或O(n log n);不能维持相同复杂度声明。
- 只需稳定按rank排序对象而不是字符,使用稳定sort并保留payload,成本O(n log n)。
