PAT 1003 我要通过

本文介绍了一个判断字符串是否符合特定PAT模式的算法。该模式要求字符串中仅包含字符P、A、T,并确保P出现一次,T出现一次且位于P之后,同时PT间及T后必须含有一定数量的A字符,满足特定数学条件。

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

1.需要注意一下 A的个数,满足P左边A的个数设为 x1 ,P T之间A的个数设为x2,T右边的A个数设为x3,其 满足 x1 * x2 = x3,且P T之间必须要存在至少一个 A。


#include <iostream>
#include <cstring>

//P T 只能有一个,且其余只能为 A,除此之外,顺序为 P A T  
//找出错误的即可A PAT A
 
 
using namespace std;

string judge(string x)
{   
    int count_p=0;
    int count_t=0;
    
    //first detect 
    for(int i=0;i<x.length();i++)
    {
   	   if(x[i]=='P')
		 {
		  	count_p++;
		 } 
		 if(count_p>1)
		 {
		 	return "NO";
		 }
		 if(x[i]=='T')
		 {
		   count_t++;
		 }
		 if(count_t>1)
		 {
		 	return "NO";
		 }
	}
	
	//second detect
	for(int i=0;i<x.length();i++)
    {
    	if(x[i]!='P' && x[i]!='A' && x[i]!='T')
         {
         	return "NO";
		 }
	}
	
	//third detect
	int link = 0;
	for(int i=0;i<x.length();i++)
    {
       	  if(x[i]=='P')
          {
       	   link++;  //+1
	      }
	      if(x[i]=='T')
	      {
	   	  link++;  //+1
	      }
       
	}
	 if(link!=2)
	 {
	 	return "NO";
	 }
	 
	//forth detect
	int detect_a = 0;
	for(int i=0;i<x.length();i++)
    {
         if(x[i]=='A')
         {
         	detect_a++; 
		 }
	}
	 if(detect_a<1)
	 {
	 	return "NO";
	 }
	
	//fifth detect  ,若 T 在 P前面则出错 
    int sort_p=0;
	int sort_t=0;
		 
	for(int i=0;i<x.length();i++)
    {
    	if(x[i]=='P')
    	{
    		sort_p = i;  // 4
		}
		if(x[i]=='T')
		{
			sort_t = i;  //1
		}
	}
	if(sort_p > sort_t)
	{
		return "NO";
	}
   
    //sixth detect   P XX T 检查P xx T	之间是否存在 A 
	//P,T,A的位置,所有A的位置  统计  三个位置的 A 的个数 
	int p = 0;
	int t = 0;
	int a[100];
	for(int i=0;i<100;i++)
	    a[i]=0;
	
	int cc=0;
	
	for(int i=0;i<x.length();i++)
    {
    	if(x[i]=='P')  p=i;
    	if(x[i]=='T')  t=i;
		if(x[i]=='A')
		{
			a[cc]=i; cc++;
		}	
	}  
	
	int a_large_p=0;   //p t 之间  p xx t
	int a_small_p=0;   //p的左边   xxx p 
	int a_large_t=0;  // t的右边   t xxx
	 
    for(int i=0;i<cc;i++)
    {
    	if(a[i]>p && a[i]<t)
    	{
    		a_large_p++;
		}
		if(a[i]<p)
		{
			a_small_p++;
		}
		 if(a[i]>t)
		 {
		 	a_large_t++;
		 }
	}
	
    if(a_large_p<1)
	{
		return "NO";
	}
    
    if(a_large_p*a_small_p==a_large_t)
    {
    	return "YES";
	}
	else{
        return "NO";
    }
	
	
	
	

}



int main()
{
   string str[100];
   int n;
   cin>>n;
   
   for(int i=0;i<n;i++)
   {
   	cin>>str[i];
   }
   
   for(int i=0;i<n;i++)
   {
   	 string res =  judge(str[i]);
   	 cout<<res<<endl;
   }
   
   
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值