Algorithm 带重复的排序排列秩
给定一个字符串,在按字典顺序排序的排列中查找该字符串的排名。 请注意,这些字符可能会重复。如果字符重复,我们需要查看唯一排列中的排名 查看示例以了解更多详细信息 输入:“aba” 产出:2 字母“a”、“a”和“b”的顺序排列: aab 阿巴 咩 我能够解决独特的字符,但不能重复字符。有人能帮我用python编写代码吗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
谢谢您可以生成排列、排序并找到原始字符串:
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;
}