【华为OD机试真题 python】全排列

题目描述:

给定一个只包含大写英文字母的字符串S,要求你给出对S重新排列的所有不相同的排列数。

如:S为ABA,则不同的排列有ABA、AAB、BAA三种。

解答要求

时间限制:5000ms, 内存限制:100MB


输入描述

输入一个长度不超过10的字符串S,确保都是大写的。

输出描述

输出S重新排列的所有不相同的排列数(包含自己本身)。


示例 1:

输入:ABA

输出: 3

示例 2:

输入: ABCDEFGHHA

输出:907200


#解题1:排列首先想到itertools模块

import itertools
from itertools import combinations,permutations

#permutations 连续返回由 iterable 元素生成长度为 r 的排列

s=input().upper()
new=[]
for i in permutations(s,len(s)):
    if i not in new:
        new.append(i)
print(len(new))
#但是长度过大 不满足运行时间(需要修改算法)

修改算法:采用数学思路 

先把每个字符当成唯一出现过一次,计算所有排列数;再统计重复出现的字母,除去每个字母的排列次数。

例如:

 转化到python,即使用元素个数统计+阶乘思路

# 阶乘函数1
def fn(n):
    if n==1:
        return 1
    else:
        return n*fn(n-1)
# 阶乘函数2
# import math
# print(math.factorial(3))

#统计元素数量,使用字典存储
s=input().upper()
dic={}
for i in s:
    if i not in dic.keys():
        dic[i]=s.count(i)

#Sa * Sb
a=1
for v in dic.values():
    a=a*fn(v)

#S总/ Sa * Sb

res=fn(len(s))/a
print(int(res))

你可能感兴趣的:(python基础,python,算法,开发语言)