1003 我要通过!

本文深入探讨了PAT字符串匹配问题的解决策略,通过分析P、A、T字符的分布规律,提出了一种有效的算法实现。文章详细介绍了如何利用C++进行代码实现,包括字符计数、位置查找及满足特定条件的验证过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

只看代码直接拖到最下面
在这里插入图片描述

其实刚一看这个题没看懂,很轻易就能得出的结论是:
必须要有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.youkuaiyun.com/qq_40883132/article/details/80775864
代码中检验的几点是:
1.包含每个字符必须是PAT中的一个
2.P在T前面
3.P和T个数为1,A至少1个
4.n3=n1*n2

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

在这里插入图片描述
在这里插入图片描述

#include<iostream>
#include<string>
#include<algorithm>
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;
}
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值