PAT乙级—1040 有几个PAT (25分)

字符串 APPAPT 中包含了两个单词 PAT,其中第一个 PAT 是第 2 位§,第 4 位(A),第 6 位(T);第二个 PAT 是第 3 位§,第 4 位(A),第 6 位(T)。
现给定字符串,问一共可以形成多少个 PAT?
输入格式:
输入只有一行,包含一个字符串,长度不超过10​5​​,只包含 P、A、T 三种字母。
输出格式:
在一行中输出给定字符串中包含多少个 PAT。由于结果可能比较大,只输出对 1000000007 取余数的结果。

输入样例:
APPAPT
输出样例:
2

思路:

  1. 思路1(最容易想到的循环):
     使用三重循环,截取字符串循环查找,但是会超时
  2. 思路2(用公式):
     PAT的组成主要看作是,固定A的位置找P,T的多少相乘。可以记录T的个数,P做加法,T做减法,然后,找到A的位置,即做P*T

注意:

  1. 截取的字符串会包含换行符’\n’,故string的长度会增加一位,以后可以直接用str.substr(n+1)来往后截取,不用担心越界。

代码:(C++)
1、循环(超时)

#include<iostream>

using namespace std;

int main()
{
	string str;
	getline(cin,str);
	int p,a,t;
	long long sum = 0;
	while((p=str.find('P')) != str.npos)
	{
		string str1 = str.substr(p);
		while((a=str1.find('A')) != str1.npos)
		{
			string str2 = str1.substr(a);
			while((t=str2.find('T')) != str2.npos)
			{
				str2 = str2.substr(t+1);
				sum++;
			}
			str1 = str1.substr(a+1);
		}
		str = str.substr(p+1);
	}
	cout<<(sum%1000000007);
	
	return 0;
}

2、计算(完美)

#include<iostream>

using namespace std;

int main()
{
    string str;
    getline(cin,str);
    int p = 0, t=0;
    long long sum = 0;
    for(int i=0; i<str.length(); i++)
    {
        if(str[i] == 'T')
            t++;
    }
    for(int i=0; i<str.length(); i++)
    {
        if(str[i] == 'P') p++;
        if(str[i] == 'T') t--;
        if(str[i] == 'A')
        {
            sum = ((p*t) + sum) % 1000000007;
        }
    }
    cout<<sum;
    
    return 0;
}
发布了77 篇原创文章 · 获赞 20 · 访问量 5788

猜你喜欢

转载自blog.csdn.net/qq_42396168/article/details/104978090