最少步

题目描述

有一天课堂上老师出了一个难题给张三,题目:开头给你一个字符串,你可以把ab替换成bba,直到没有ab就算完成任务,然后问你最少替换次数是多少,结果%1000007
输入
输入一个字符串,只含有a与b(1<=字符串长度<=100000)
输出
输出最少替换次数
样例输入
aab
样例输出
3
提示
多组输入
aab->abba->bbaba->bbbbaa

分析:

由题目样例解析我们会发现,替换完后,最终结果肯定是前面都是b,后面都是a,所以我们在替换的时候就是取决于a后面有多少个b,
例如 abb->bbab->bbbba 这里就是被替换了两次
所以我们每次只要数每个a后面有多少个b即可
因为我们考虑到从前面的a开始算的话,后面的a再替换前面也会受到影响,所以我们从后面的a开始处理,然后到每个a的时候去计算后面有多少个b,每找到一个a,b的个数变的规则也很容易看出就是翻了一倍变成2*b,用个变量单独计算b的个数即可

#include"stdio.h"
char a[100000000];

int main()
{

    long long count,i,j,l,countb;
    while(~scanf("%s",a))
    {  count=0;
       countb=0;
       l=strlen(a)-1;
       while(l>=0)
       {
           if(a[l]=='b')
           {
               countb++;
           }
           else
           if(countb!=0)
             {
                 count=(count+countb)%1000007;
                 countb=2*countb;
                 countb=countb%1000007;
             }
            l--;
       }

     printf("%lld\n",count);
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值