def f(c: str) -> bool:
if c >= "a" and c <= "z":
return True
if c >= "A" and c <= "Z":
return True
return False
try:
while True:
s = [i for i in input()]
n = len(s)
if n == 0:
print("")
continue
# print(s)
dic = [[] for _ in range(26)]
for c in s:
if f(c):
t = ord(c.lower()) - ord("a")
dic[t].append(c)
# print(dic)
index, p = 0, 0
# 移动到第一个不为空的地方
while index < 26 and len(dic[index]) == 0:
index += 1
# 获取该字符出现的长度
m = len(dic[index])
# 枚举s字符串
for i in range(n):
# 非字母不动
if not f(s[i]):
continue
if p < m:
s[i] = dic[index][p]
p += 1
if p == m:
# 重置指针
p = 0
# 移动到下一个不为空的字符集合
index += 1
while index < 26 and len(dic[index]) == 0:
index += 1
if index < 26:
m = len(dic[index])
print("".join(s))
except Exception:
pass
哈希表存储
使用哈希表存储每个字符的出现顺序,最大也就26个。所以可以直接开26个数组用来存储。
再次遍历字符串,对字母位置的字符进行重新装填。

京公网安备 11010502036488号