思路
由三个条件可得
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.换行符号是\,向右。