Python 小易的字典

32 篇文章 1 订阅
29 篇文章 0 订阅

编程题

思路

可以用动态规划的思想解决这样的题目,把一个大的问题拆分为两个小问题来解决。这里只有两个不一样的字母。那么字典中的字符串肯定是a开头的和z开头的。并且我们已知有多少个a和多少个z,就能求出他们有多少种排列组合(设为x)。那么这个适合会出现两种情况,如果k大于x,那么输出-1,如果k小于x,那么就看剩下的两种情况,1. 如果第一个字母是a的话,那么以a为首字母的字符串的排列组合是由n-1个a和m个z组成,那么我们只需要比较k和count(n-1,m)组合数的大小,如果小于这个组合数,那么就代表,是以a开头的字符串。2
如果大于,那么就代表是以z开头的字符串,那么原本k的问题,就编程了,k-count(n-1,m)的问题。

链接:https://www.nowcoder.com/questionTerminal/12b1b8ef17e1441f86f322b250bff4c0
来源:牛客网

import math
n, m, k =list(map(int,input().split()))
def C(n,m):    #组合公式
    return  math.factorial(n+m)/(math.factorial(n)*math.factorial(m))
r = []
def solve(n,m,k):
    if n ==0:
        for i in range(m):
            r.append('z')
        return
    if m ==0:
        for i in range(n):
            r.append('a')
        return
    if k > C(n-1,m):    #以a开头可能的字符串为C(n-1,m)种,均排在以z开头前,
        r.append('z')
        solve(n,m-1,k-C(n-1,m))    #以z开头,问题转为剩余字串中第k-C(n-1,m)个
    else:
        r.append('a')
        solve(n-1,m,k)
if k> C(n,m):
    print(-1)
else :
    solve(n,m,k)
    print(''.join(r))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值