1003 我要通过 (20 分)

在这里插入图片描述

思路
由三个条件可得
1、只有P、A、T三种字符
2、P在T前面
3、P和T个数为1,A至少1个
4、n1*n2 = n3。

关于第4点:
----P-----T----- ,n1,n2,n3分别为前中后三段字符串的长度。
由条件2、3可知,aPbTc 中,P、T之间每增加一个字符A,T之后就要增加一个字符串a。相当于P、T之间字符串的长度 len(b)每增加1,T 之后的字符串长度 len(c)就要增加 len(a)。

又由条件2可知,b的长度至少为1,且b的长度每次+1,c的长度加len(a)。
故有 len(b) * len(a) = len(c)。

参考别人之后写的代码

#include <iostream>
#include <string>
#include <map>
using namespace std;
int main ()
{
    int n,p,t;//p、t记录字符P、T的下标
    string s;
    cin >> n;

    //1.依次输入n个字符串,并对每个字符串做处理
    for(int i = 0;i < n;i++){
        map <char,int> m; //用一个map来记录p、t、a的个数
        cin >> s;

      //2.利用map对每个字符串进行处理
      for(int j = 0;j < s.size();j++){
          m[s[j]]++;  
          	//对字符串s中所有出现的字符做记录并记个数,之后用m.size()判断是否有多余的字符		 
        if(s[j] == 'P')
            p = j;  
        if(s[j] == 'T') {
            t = j;
        }
      }
      //3.判断上边四个条件并输出结果
       if(m['A'] != 0 && m['P'] == 1 && m['T'] == 1 && 
       		m.size() ==3 && t - p != 1 && p * (t-p-1) == s.length() - t - 1 )
        cout << "YES\n";
      else
        cout << "NO\n";
    }
    return 0;
}

总结

//1.map的使用
1.1根据题意使用
	map <char,int> m; //字符
	map <string,int> m;//字符串
	之后用m调用,如m['A'] = 1;此时map中已经有'A'这个键。
	并注意其中使用" " 还是' '.
1.2 map可以统计字符串中出现了哪些字符,并对其计数。

2.注意===号的区别。code中容易写错。
3.索引数组或者字符串用[i]而不是(i)。
4.换行符号是\,向右。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值