1003 我要通过!

只看代码直接拖到最下面
1003 我要通过!_第1张图片

其实刚一看这个题没看懂,很轻易就能得出的结论是:
必须要有PAT三个字符,P,T有且只有一个,P在T前面。
第2,3点就不知道具体想表达啥了,反正我是没看出来。看了一下网上的博客,大家普遍认同的一种结论是:
以P和T为边界可以分为三部分: ********** P***********T *********,也就是画星号的三部分。我们先不管空字符串的情况,如果星号都是由字母A组成,以上归纳出来的规律是这样的,如果P之前的A的个数为n1,P到T之间的A个数为n2,T之后的A的个数为n3,那么有n3=n2n1.具体怎么得出来的我也不知道,用这个式子去验证那几种样例是明显符合的。

上代码:
这代码看了这个博主的思路,写出来基本一样了…https://blog.csdn.net/qq_40883132/article/details/80775864
代码中检验的几点是:
1.包含每个字符必须是PAT中的一个
2.P在T前面
3.P和T个数为1,A至少1个
4.n3=n1*n2

解释一下为什么大家都没有去关注那个空字符串,我开始觉得每个字符必须是PAT,那空格呢,在我的想象中,之前学字符串打印一个hello world 中间的空格也算是一个字符啊。但是在计算长度的时候去写个代码发现,如果两个单词中间有一个空格他的字符串就在空格处直接结束了。如果前后有空格,空格没有算长度的。那这道题我们的空字符可以不管他了。只计算a就行了。

1003 我要通过!_第2张图片
1003 我要通过!_第3张图片

#include
#include
#include
using namespace std;

bool judge(string s)
{
	int i;
	int count_p = 0, count_a=0, count_t=0;
	int position_p = 0, position_a=0,position_t = 0;
	int num1 = 0, num2 = 0, num3 = 0;
	for (i = 0; i < s.length(); i++)
	{
		if (s[i] != 'P'&&s[i] != 'A'&&s[i] != 'T')     //如果某个字符不是P A T三个字符中的一个,直接判断为错误
			return false;
		if (s[i] == 'P')         //计算这三个字符的个数
			count_p++;
		else if (s[i] == 'A')
			count_a++;
		else if (s[i] == 'T')
			count_t++;
	}
		if (count_p != 1 || count_t != 1 || count_a < 1)
			return false;
	
		position_p = s.find('P');   //找到这三个字符的位置
		position_a = s.find('A');
		position_t = s.find('T');
		if (position_p >= position_t)
			return false;
		for (i = 0; i < s.length(); i++)
		{
			if (i < position_p&&s[i] == 'A')
				num1++;
			else if (i > position_p&&i<position_t&&s[i] == 'A')
				num2++;
			else if (i > position_t&&s[i] == 'A')
				num3++;
		}
		if (num3 == num1 * num2)      //是否满足那个条件
			return true;
		else
			return false;	
}

int main()
{
	int n;
	string s;
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		cin >> s;
		if (judge(s))
			cout << "YES" << endl;
		else
			cout << "NO" << endl;
	}
	return 0;
}

你可能感兴趣的:(pat刷题记录(乙))