此题唯一的难点是找出当前字符串之前的组合,用到组合数,有三种形式可以算,数学公式如下
还有一种就是杨辉三角数组
for(int i=0;i<50;i++)
{
c[i][0]=1;
}c[1][1]=1;
for(int i=2;i<50;i++)
{
for(int j=1;j<50;j++)
{
c[i][j]=c[i-1][j]+c[i-1][j-1];
}
}
即c[i][j]对应的是从i个数中取j个数的组合数。
处理完毕之后开始设定违规条件。
设定违规条件完毕后,先将长度之前的已经确定的数量加起来
ll jie=0;
for(int i=1;i<b;i++)
{
jie+=c[26][i];
}
之后就开始按条件循环,首先当看第一位时,应当从'a'开始,比如总共为3位,以'a'开始,那么之后的两位就是从25个数里取2个组合。
AC代码如下:
#include<bits/stdc++.h>
#define ll long long int
using namespace std;
int c[50][50];
int main()
{
for(int i=0;i<50;i++)
{
c[i][0]=1;
}c[1][1]=1;
for(int i=2;i<50;i++)
{
for(int j=1;j<50;j++)
{
c[i][j]=c[i-1][j]+c[i-1][j-1];
}
}
char a[10];
cin>>a;
int b=strlen(a);
if(b>6)
{
cout<<0;return 0;
}
for(int i=1;i<b;i++){
if(a[i]<=a[i-1]){
cout<<0;return 0;
}
}
ll jie=0;
for(int i=1;i<b;i++)
{
jie+=c[26][i];
}
for(int i=0;i<b;i++)
{
if(i==0){
for(char z='a';z<a[i];z++)
{
jie+=c[26-z+'a'-1][b-i-1];
}
}
else
{
for(char z=a[i-1]+1;z<a[i];z++)
{
jie+=c[26-z+'a'-1][b-i-1];
}
}
}
cout<<jie+1;//需要加上本身
}