带重复的排序排列等级

时间:2017-12-16 11:51:43

标签: algorithm python-3.x data-structures recursive-datastructures

给定一个字符串,找到按字典顺序排列的字符串的排名。 请注意,可能会重复这些字符。如果重复这些字符,我们需要以独特的排列来查看排名。

查看示例以获取更多详细信息。

输入:' aba'

输出:2

使用字母' a',' a'和' b' :

AAB

ABA

BAA

我能够解决独特的角色,但没有重复的角色。有人可以帮我在python中编写代码吗?

由于

2 个答案:

答案 0 :(得分:0)

您可以生成排列,对它们进行排序,并找到原始字符串:

from itertools import permutations
def permutation_index(s):
    return sorted(''.join(x) for x in permutations(s)).index(s)

答案 1 :(得分:0)

long long int pow_mod(long long int a,long long int b)
{
    long long MOD=1000003;
    if(a == 1)
    return 1;
    long long int x =1 ,y = a;
    while(b>0)
    {
        if(b%2)
        {
            x = (x*y)%MOD;
        }
        y = (y*y)%MOD;
        b = b>>1;
    }
    return x;
}


int Solution::findRank(string A) {
    long long ans=0;
    long long mod=1000003;
    long long  arr[300];
    long long n=A.length();
    long long fact[n];
    fact[0]=1;
    for(int i=1;i<n;i++)
    {
        fact[i]=((fact[i-1]%mod)*(i%mod))%mod; 
    }
    for(long long i=0;i<300;i++)
        arr[i]=0;

    for(long long i=0;i<n;i++)
    {

        arr[A[i]]++;

    }
   // for(long long i=0;i<26;i++)
     //   cout<<arr[i]<<" ";


    for(long long i=0;i<n;i++)
    {

        long long cnt=0;
        long long di=1;


        for(long long j=(A[i]-1);j>=0;j--)
        {
                        cnt+=arr[j];

        }




       // cout<<cnt<<" ";

        for(int j=0;j<300;j++)
        {

            di=(di%mod * fact[arr[j]]%mod)%mod;
        }
        long long a=pow_mod(di,(mod - 2)) % mod;



       // cout<<di<<" ";


        ans=(ans+((cnt*fact[n-i-1])%mod * a )%mod)%mod;


      //  cout<<ans<<" ";
       arr[A[i]]--;


    }
    ++ans;
    return ans%mod;



}