字典升序问题

 
  
 1 // 字典升序问题 
 2 #include <iostream>     // std::cout
 3 #include <iterator>     // std::advance
 4 #include <list>         // std::list
 5 #include <cmath>
 6 using namespace std;
 7    
 8  int f(int i,int k){  //定义:返回以第i个字母打头的k位字符串总个数 
 9   if(k==1) return 1;
10   int sum=0;
11   for(int j=i+1;j<=26;++j)
12   {
13    sum+=f(j,k-1);   } 
14   return sum;    
15         
16         }
17  
18  int g(int k){//定义:返回k位字符串总个数 
19    int sum1=0;
20    for(int i=1;i<=26;++i){
21       sum1+=f(i,k);        
22          } 
23    return sum1;  
24      } 
25  
26  
27  int main(){
28    string a;//string的成员函数 
29     cin>>a;
30   
31   for(int i=0;i<a.size()-1;++i)  
32    if(a[i]>=a[i+1])   
33   {
34     printf ("The string must be in ascending order,please check your string!");
35     system("PAUSE");
36     exit (EXIT_FAILURE);
37   }
38   
39   int sum0=0;
40   int k=a.size();
41   for(int i=1;i<=k-1;++i)
42     sum0+=g(i);
43     
44   // cout<<sum0<<endl;
45   if(k>1){ 
46   for(int i=1;i<=a[0]-'a';++i)
47   sum0+=f(i,a.size());
48   //cout<<sum0<<endl;
49   //cout<<g(1)+g(2)+g(3)+f(1,4)+f(2,4)+f(3,4);
50    }
51    //cout<<sum0<<endl;
52    
53   k--;
54   while(k>1){
55   int j=a[a.size()-k-1]-'a'+1;//提取当前研究位 
56   int jj=j+1; 
57   int jjj=a[a.size()-k]-'a';
58   
59   for(int i=jj;i<=jjj;++i)
60    sum0+= f(i,k);
61    k--;
62 }
63   if(a.size()==1) sum0=a[0]-'a'+1;
64   else
65       sum0+=a[a.size()-1]-a[a.size()-2];
66    cout<<sum0<<endl;
67    
68   
69  // cout<<sum0<<endl;
70   
71  //cout<<f(1,2)<<endl;
72  // cout<<g(6)<<endl;
73    system("PAUSE");
74    return 1;
75  
76  
77  }
 
  

 

 

     

转载于:https://www.cnblogs.com/jieforever/p/4679880.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值