字符串 APPAPT 中包含了两个单词 PAT,其中第一个 PAT 是第 2 位§,第 4 位(A),第 6 位(T);第二个 PAT 是第 3 位§,第 4 位(A),第 6 位(T)。
现给定字符串,问一共可以形成多少个 PAT?
输入格式:
输入只有一行,包含一个字符串,长度不超过105,只包含 P、A、T 三种字母。
输出格式:
在一行中输出给定字符串中包含多少个 PAT。由于结果可能比较大,只输出对 1000000007 取余数的结果。
输入样例:
APPAPT
输出样例:
2
思路:
- 思路1(最容易想到的循环):
使用三重循环,截取字符串循环查找,但是会超时 - 思路2(用公式):
PAT的组成主要看作是,固定A的位置找P,T的多少相乘。可以记录T的个数,P做加法,T做减法,然后,找到A的位置,即做P*T
注意:
- 截取的字符串会包含换行符’\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;
}