📅  最后修改于: 2023-12-03 15:19:39.654000             🧑  作者: Mango
给定一个字符串 s
,请在查询范围 [L, R]
内找到字典序最小的 s
的所有变位词。
首先,我们需要对字符进行计数,以便对字符进行排序。然后,我们可以使用桶排序将相同计数的字符放在一起,从而方便地找到变位词。
对于查询范围 [L, R]
,我们需要维护两个数组:一个用于存储 s[L:R]
中每个字符的计数,另一个用于存储 s
中每个字符的计数。然后,我们可以将这两个数组进行比较,以找到变位词。如果它们是相等的,那么 s[L:R]
就是一个变位词。如果它们不相等,我们可以按照桶排序的方法,找到第一个不相等的字符,然后使用它来构造一个新的变位词。最后,我们需要在所有变位词中选择字典序最小的一个。
def smallest_ana(s: str, L: int, R: int) -> str:
cnt1 = [0] * 26
cnt2 = [0] * 26
for c in s[L:R+1]:
cnt1[ord(c) - ord('a')] += 1
for c in s:
cnt2[ord(c) - ord('a')] += 1
def check(cnt1, cnt2):
for i in range(26):
if cnt1[i] != cnt2[i]:
return False
return True
if check(cnt1, cnt2):
return s[L:R+1]
else:
for i in range(L, R + 1):
cnt1[ord(s[i]) - ord('a')] -= 1
cnt1[ord(s[L-1]) - ord('a')] += 1
if cnt1 == cnt2:
return s[L: i+1]
return s[L: R+1]