python按字母顺序排列_在Python中按字符串的字母顺序查找第n个排列

假设我们有一个长度为m的字符串,并且该字符串仅包含小写字母,我们必须按字典顺序查找字符串的第n个置换。

因此,如果输入类似于string =“ pqr”,n = 3,则输出将为“ qpr”,因为所有排列均为[pqr,prq,qpr,qrp,rpq,rqp],它们的排列顺序相同。

为了解决这个问题,我们将遵循以下步骤-MAX_CHAR:= 26

MAX_FACT:= 20

阶乘:=大小为MAX_FACT的数组

阶乘[0]:= 1

对于范围1至MAX_FACT的i,执行阶乘[i]:=阶乘[i-1] * i

大小:=字符串大小

出现:=大小为MAX_CHAR的数组,用0填充

对于介于0到大小范围内的i,执行事件[(string [i])的ASCII-('a')的ASCII]:=事件[(字符串[i])的ASCII-('a')的ASCII] + 1

res:=大小为MAX_CHAR的数组

和:= 0,k:= 0

虽然Sum与n不同,但是如果出现[i]与0相同,则

出现[i]:=出现[i]-1

temp_sum:=阶乘[大小-1-k]

对于范围0到MAX_CHAR的j,执行

总和:=总和+ temp_sum

如果Sum> = n,则

如果Sum

进行下一次迭代

temp_sum:= temp_sum / factorials [occurrence [j]](整数除法)

res [k]:=来自ASCII码的字符(i +('a')的ASCII)

n:= n-总和-temp_sum

k:= k + 1

从循环中出来发生[i]:=发生[i] +1

总和:= 0

对于0到MAX_CHAR范围内的i,执行

我:= MAX_CHAR-1

当k = 0时,res [k]:=来自ASCII码的字符(i +('a')的ASCII)

出现[i]:=出现[i]-1

我:=我+ 1

k:= k + 1

如果出现[i]不为零,则

我:=我-1

将字符串从res从索引0返回到(k-1)

示例

让我们看下面的实现以更好地理解-MAX_CHAR = 26

MAX_FACT = 20

factorials = [None] * (MAX_FACT)

def get_nth_permute(string, n):

factorials[0] = 1

for i in range(1, MAX_FACT):

factorials[i] = factorials[i - 1] * i

size = len(string)

occurrence = [0] * (MAX_CHAR)

for i in range(0, size):

occurrence[ord(string[i]) - ord('a')] += 1

res = [None] * (MAX_CHAR)

Sum = 0

k = 0

while Sum != n:

Sum = 0

for i in range(0, MAX_CHAR):

if occurrence[i] == 0:

continue

occurrence[i] -= 1

temp_sum = factorials[size - 1 - k]

for j in range(0, MAX_CHAR):

temp_sum = temp_sum // factorials[occurrence[j]]

Sum += temp_sum

if Sum >= n:

res[k] = chr(i + ord('a'))

n -= Sum - temp_sum

k += 1

break

if Sum 

occurrence[i] += 1

i = MAX_CHAR-1

while k = 0:

if occurrence[i]:

res[k] = chr(i + ord('a'))

occurrence[i] -= 1

i += 1

k += 1

i -= 1

return ''.join(res[:k])

n = 3

string = "pqr"

print(get_nth_permute(string, n))

输入项"pqr"

输出结果qpr

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值