📌  相关文章
📜  Q查询的[L,R]范围内给定字符串的字典最小变位词(1)

📅  最后修改于: 2023-12-03 15:19:39.654000             🧑  作者: Mango

查询[L, R]范围内给定字符串的字典最小变位词

简介

给定一个字符串 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]