PAT B1003 我要通过!(满分20)

思路点拨:
这道题的关键之处在于对第三个条件的解读
条件三:如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a、 b、 c 均或者是空字符串,或者是仅由字母 A 组成的字符串。
解读:a,b,c分别为A的个数。只要满足规律:ab=c,则条件三就成立。
会发现第二个条件是第三个条件的特殊情况。
所以,需要满足的三个条件简言之:
字符串正确,则必须含有三个字符P、A、T;
满足a
b=c。
转换问题为:分别求输入的字符串中的P、A、T三个字符之间A的个数,对个数进行判断。

代码如下:

#include<iostream>
#include<string>

using namespace std;

int main()
{
    
    
	int n;
	cin >> n;
	string s;
	string str[10];
	for (int i = 0; i<n; i++)
	{
    
    
		cin >> s;
		str[i] = s;
	}

	int a[10], b[10], c[10];
	int d, e;
	for (int i = 0; i < n; i++)
	{
    
    
		for (int j = 0; j < str[i].size(); j++)
		{
    
    
			if (str[i].at(j) == 'P' || str[i].at(j) == 'A' || str[i].at(j) == 'T')
			{
    
    
				if (str[i].at(j) == 'P') d = j+1;
				else if (str[i].at(j) == 'A');
				else if (str[i].at(j) == 'T') e = j+1;
			}
			else
			{
    
    
				str[i] = "NO";
				break;
			}
		}
		if (str[i] != "NO")
		{
    
    
			a[i] = d - 1;
			b[i] = e - d-1;
			c[i] = str[i].size() - e;
		}
	}

	for (int i = 0; i<n; i++)
	{
    
    
		if (str[i] != "NO") {
    
    
			if (a[i] * b[i] == c[i] && b[i] != 0) str[i] = "YES";// b[i] != 0为了排除PT
			else str[i] = "NO";
		}
	}

	for (int i = 0; i<n; i++)
		cout << str[i] << endl;

	system("pause");
	return 0;
}

反思总结:
这道题,考察的知识十分基础,而且不涉及任何算法,主要是考察字符串的基本用法。这道题的巧妙之处在于,如何能把题目进行转化。同时,如何能够巧妙地统计a,b,c分别代表的A的个数。

这道题代码实现完全是自己的想法,希望有所帮助。

猜你喜欢

转载自blog.csdn.net/qq_27538633/article/details/105896296
今日推荐