1003 我要通过! (20 分)

518 阅读2分钟

题目链接

  1. 这道题一共给了三个条件,前一个条件是后一个条件的基础,并且只有完全满足这三个条件的字符串才成输出“YES”
  2. 根据条件二,我们知道xPATx是正确答案,注意x为空或者是全A字符串。这样在根据条件三,就可以知道xPAATxx也是正确的。
  3. 根据上面我们就可以得到一个规律,(P左面的A的个数)*(P和T之间A的个数)=(T右面的A的个数)。
  4. 需要注意的地方,字符串有且仅有一个P一个T,且A的个数不能为0。

C++代码

#include <iostream>
#include<string>
#include <map>
using namespace std;
int main() {
	int n;
	int p, t;//记录p的位置,记录t的位置,第一个字符从1开始计算
	cin >> n;
	string s; //要验证的字符串
	while (n--) {
		map<char, int> res;
		p = t = 0;
		cin >> s;
		for (int i = 0; i < s.size(); i++) {
			res[s[i]]++;
			if (s[i] == 'P')
				p = i + 1;
			if (s[i] == 'T')
				t = i + 1;
		}
		//判断条件,map中必须且只有PAT三种字符,P和T的字符个数都是1
		//(P左面的A的个数)*(P和T之间A的个数)=(T右面的A的个数)
		if (res.size() == 3 && res['A'] != 0 && res['P'] == 1 && res['T'] == 1 && (p - 1)*(t - p - 1) == (res['A'] + 2 - t)) {
			cout << "YES" << endl;
		}
		else
			cout << "NO" << endl;
	}
}

python3代码

n = input()
n=int(n)

for i in range(n):
    s = input()
    res = {}
    p = 0
    t = 0
    for j in range(len(s)):
        if(s[j]  not in res.keys()):
            res[s[j]] = 0

        res[s[j]] = res[s[j]]+1

        if(s[j] is 'P'):
            p = j+1

        if(s[j] is 'T'):
            t = j+1

    if(len(res) == 3 and res['A']!=0 and res['P'] == 1 and res['T']==1 and (p-1)*(t-p-1)==(res['A'] + 2 - t)):
        print('YES')
    else:
        print('NO')