给定一个字符串,找到按字典顺序排列的字符串的排名。 请注意,可能会重复这些字符。如果重复这些字符,我们需要以独特的排列来查看排名。
查看示例以获取更多详细信息。
输入:' aba'
输出:2
使用字母' a',' a'和' b' :
AAB
ABA
BAA
我能够解决独特的角色,但没有重复的角色。有人可以帮我在python中编写代码吗?
由于
答案 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;
}