一个字符长度的时候有c[26][1],即从26个字符中选一个的组合,长度为2的时候,有c[26][2],即从26个字符中选两个的组合(组合不用考虑顺序,肯定能按字典序排列,并且是唯一的),长度为3,c[26][3],依次类推。。。
所以当一个字符串长度为len的时候,ans首先要加上c[26][1]+c[26][2]+...+c[26][len-1];
然后根据第一个字符与‘a’的距离s,ans+=c[26-j][len-1] (j=1,...s);
之后是算第二个字符与第一个字符之间所间隔的code数,然后是第三个字符和第二个字符之间所间隔的字符数。。。。
for(i=1;i<len;i++)
{
k=ch[i-1]-'a'+2;
for(j=k;j<ch[i]-ch[i-1]+k-1;j++)
{
ans+=c[26-j][len-i-1];
}
}
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int c[30][30];
int sum[15];
int ans=0;
char ch[15];
int main()
{
int i,j,k,flag=0;
int len;
for(i=0;i<=26;i++)
{
for(j=0;j<=i;j++)
{
if(j==0||i==j)
c[i][j]=1;
else c[i][j]=c[i-1][j]+c[i-1][j-1];
}
}
sum[0]=0;
for(i=1;i<=10;i++)
sum[i]=c[26][i]+sum[i-1];
cin>>ch;
len=1;i=1;
while(ch[i])
{
if(ch[i]<=ch[i-1])
{
flag=1;
break;
}
else {len++;i++;}
}
if(flag) {cout<<"0"<<endl;return 0;}
ans+=sum[len-1];
for(j=1;j<=ch[0]-'a';j++)
ans+=c[26-j][len-1];
for(i=1;i<len;i++)
{
k=ch[i-1]-'a'+2;
for(j=k;j<ch[i]-ch[i-1]+k-1;j++)
{
ans+=c[26-j][len-i-1];
}
}
cout<<ans+1<<endl;
return 0;
}