Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 带重复的排序排列秩_Algorithm_Python 3.x_Data Structures_Recursive Datastructures - Fatal编程技术网

Algorithm 带重复的排序排列秩

Algorithm 带重复的排序排列秩,algorithm,python-3.x,data-structures,recursive-datastructures,Algorithm,Python 3.x,Data Structures,Recursive Datastructures,给定一个字符串,在按字典顺序排序的排列中查找该字符串的排名。 请注意,这些字符可能会重复。如果字符重复,我们需要查看唯一排列中的排名 查看示例以了解更多详细信息 输入:“aba” 产出:2 字母“a”、“a”和“b”的顺序排列: aab 阿巴 咩 我能够解决独特的字符,但不能重复字符。有人能帮我用python编写代码吗 谢谢您可以生成排列、排序并找到原始字符串: from itertools import permutations def permutation_index(s): re

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

查看示例以了解更多详细信息

输入:“aba”

产出:2

字母“a”、“a”和“b”的顺序排列:

aab

阿巴

我能够解决独特的字符,但不能重复字符。有人能帮我用python编写代码吗


谢谢

您可以生成排列、排序并找到原始字符串:

from itertools import permutations
def permutation_index(s):
    return sorted(''.join(x) for x in permutations(s)).index(s)
long long int pow_mod(long long int a,long long int b)
{
长模=1000003;
如果(a==1)
返回1;
长整型x=1,y=a;
而(b>0)
{
如果(b%2)
{
x=(x*y)%MOD;
}
y=(y*y)%MOD;
b=b>>1;
}
返回x;
}
int解决方案::find(字符串A){
长ans=0;
长模=1000003;
长-长arr[300];
长n=A.长度();
长事实[n];
事实[0]=1;

对于(inti=1;这是一个面试问题,所以我想用算法解决:)您可以从生成所有排列开始:。事实上,您只需生成给定字符串的排列,当然前提是您按字母顺序进行排列。但是,有更快的方法……您可以从数学上计算出来。您可能会感兴趣。虽然您的回答可能会回答问题,但最好包括这里是答案的基本部分,并提供了一个参考链接。我建议您解释一下您所做的工作以及它是如何工作的。
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;



}