【C++】1003 我要通过!(20分)

我做了个pta乙级题解的专栏,欢迎来专栏看哦~

分析在代码中的注释里,尤其是对题中“如果 aPbTc 是正确的,那么 aPbATca 也是正确的”这句话的分析。(这句话是我起初无法理解的。)

C++

#include <iostream>
#include <string>
#include <array>
using namespace std;

array<string, 10> testStr = {};

bool isTrue(string x)
{
	unsigned countPreX = 0; // 对于条件2 前面的字符串x长度
	unsigned countLatX = 0; // 对于条件2 后面的字符串x长度
	unsigned count1 = 0; // 对于条件3 P之前的A字符串长度
	unsigned count2 = 0; // 对于条件3 P T之间A的长度
	unsigned count3 = 0; // 对于条件3 T之后的A的长度
	size_t i, flag;
	int p_ = x.find("P");//P所在位置
	int t_ = x.find("T");//T所在位置

	if ((-1 == p_) || (-1 == t_) // P或T不存在
		|| (p_ > t_)) // P T位置不对
	{
		return false;
	}

	// 检测条件1
	for (size_t j = 0; j < x.size(); j++)
	{
		if (x[j] != 'P' && x[j] != 'A' && x[j] != 'T')
		{
			return false;
		}
	}

	// 检测条件2 & 检测条件3 一同检测

	/* 检测条件3 : 条件3中所说的“如果aPbTc正确” 是对于条件2来说的,【之前总是无法理解这句话来着“如果 aPbTc 是正确的,那么 aPbATca 也是正确的”】
			也就是说,条件2中正确的“PAT”,通过条件3-->可以得出正确的还有:PAAT/PAAAT.....
								APATA		-->		APAATAA/APAAATAAA/APAAAATAAAA.....
							   AAPATAA      -->		AAPAATAAAA/AAPAAATAAAAAA......
							   .
							   .
							   .
	最终结论:P之前的A的个数count1 P、T之间的A个数count2  T之后的A个数count3关系如下:
		count3 = count2 * count1【终于得到这个结论了,距离第一次做这一题,已经过去几个月了。。】
		但要注意用例:PT(不通过)
	*/

	// 计算count1
	for (i = 0; i < x.size(); i++) // 计算PAT前面的字符长度
	{
		if (x[i] != 'P')
		{
			if (x[i] != 'A')
			{
				return false;
			}
			count1++;
		}
		else
		{
			break;
		}
	}

	// 计算count2
	for (i = i + 1; i < x.size(); i++)
	{
		if (x[i] != 'T')
		{
			if (x[i] != 'A')
			{
				return false;
			}
			count2++;
		}
		else
		{
			break;
		}
	}

	// 计算count3
	for (i = i + 1; i < x.size(); i++)
	{
		if (x[i] != 'A')
		{
			return false;
		}
		count3++;
	}

	if (count1 * count2 == count3 && count2 != 0)
	{
		return true;
	}
	else
	{
		return false;
	}
}

int main()
{
	unsigned n;

	cin >> n;

	for (size_t i = 0; i < n; i++)
	{
		cin >> testStr[i];
	}

	for (size_t i = 0; i < n; i++)
	{
		if (i)
		{
			cout << "\n";
		}
		if (isTrue(testStr[i]))
		{
			cout << "YES";
		}
		else
		{
			cout << "NO";
		}
	}

	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值