乐观悲观我(字符串方法)题解

题目描述

经典的半杯水问题,告诉了我们乐观的人和悲观的人看到的东西都是不同的。

比如这里有一个字符串”WAC”,乐观的人能看到AC,而悲观的人只觉得自己WA了。

不过可惜的是如果WA单独出现,那么乐观的人也只能看到WA了。

但如果AC单独出现的话,悲观的人也能看到AC了!好耶!

现在有一个长长的字符串。请你数出乐观的人和悲观的人分别看到的AC和WA的数量。

输入

输入只有一行字符串,长度不大于200000,这个字符串只包括W,A,C三种字母,均为大写。
 

输出

输出两行,每行两个数字由空格隔开。第一行表示乐观的人眼中的WA数量和AC数量,第二行表示悲观的人眼中的WA数量和AC数量。
 

样例输入

WAWACAC

样例输出

1 2
2 1

解释

思路:

找到原字符串中“WAC” sum1

找到原字符串中“WA” sum2

找到原字符串中“AC” sum3

答案就是

sum2-sum1 sum3

sum2 sum3-sum1

无脑方法

一次遍历,一个一个单词找到WAC,记录数量。

#include<iostream>
#include<string>
using namespace std;

const int N  = 200010;

int a1=0,b1=0,a2=0,b2=0;

int main(){
    string a;
    cin>>a;
    int n = a.size();
    for(int i=0;i<n-2;i++){
        if(a[i]=='W'){
            if(a[i+1] == 'A'){
                if(a[i+2]=='C'){
                    a1++;
                    b2++;
                    i++;
                }
                else{
                    b1++;
                    b2++;
                }
            }
        }
        else if(a[i] == 'A'){
            if(a[i+1] == 'C'){
                a1++;
                a2++;
            }
        }
    }
    if(a[n-2] == 'A'){
        if(a[n-1] == 'C'){
            if(a[n-3] != 'W'){
                a1++;
                a2++;
            }
        }
    }
    else if(a[n-2] == 'W'){
        if(a[n-1] == 'A'){
            b1++;
            b2++;
        }
    }
    cout<<b1<<' '<<a1<<endl;
    cout<<b2<<' '<<a2<<endl;
    return 0;
}

巧妙方法

用到string的find函数
str.find(sub,index)
sub是子串,index是下标,从那里开始找
如果找到了返回下标,没找到返回一个很大的数,转为整形是int

(代码不是很完美,可以应用index参数)

#include<iostream>
#include<string>
using namespace std;
int main()
{
    string a;
    cin>>a;
    int wacnum=0,wanum=0,acnum=0;
    int l=a.length();
    for(int i=0;i<l;i++)
    {
        string b(a,i,l);
        int r=b.find("WAC");
        if(r!=-1)
        {
            wacnum++;
            i+=r+2;
        }
        else break;
    }
    for(int i=0;i<l;i++)
    {
        string b(a,i,l);
        int r=b.find("WA");
        if(r!=-1)
        {
            wanum++;
            i+=r+1;
        }
        else break;
    }
    for(int i=0;i<l;i++)
    {
        string b(a,i,l);
        int r=b.find("AC");
        if(r!=-1)
        {
            acnum++;
            i+=r+1;
        }
        else break;
    }
    cout<<wanum-wacnum<<" "<<acnum<<endl;
    cout<<wanum<<" "<<acnum-wacnum<<endl;
    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值