字符串APPAPT中包含了两个单词“PAT”,其中第一个PAT是第2位(P),第4位(A),第6位(T);第二个PAT是第3位(P),第4位(A),第6位(T)。
现给定字符串,问一共可以形成多少个PAT?
输入格式:
输入只有一行,包含一个字符串,长度不超过105,只包含P、A、T三种字母。
输出格式:
在一行中输出给定字符串中包含多少个PAT。由于结果可能比较大,只输出对1000000007取余数的结果。
输入样例:APPAPT输出样例:
2
思路:暴力肯定是不行的 必然超时 10^5 * 10^5 * 10^5 这样跑到明年了 所以用动态规划的思想 记忆化储存 然后搜索
即储存每次下标满足的个数 最后直接输出即可 典型的空间换时间
#include <bits/stdc++.h>
using namespace std;
int dp[100010],dp_1[100010];//dp[i]表示 i为小标的T 的最大个数
int main()
{
int ans = 0 , p = 1000000007;
string s;
cin>>s;
memset(dp,0,sizeof(dp));
memset(dp_1,0,sizeof(dp_1));
for(int i = s.length()-1;i >= 0; i--)
if(s[i] == 'T')
dp[i] = dp[i+1] + 1;
else
dp[i] = dp[i+1];
for(int i = s.length()-1; i >= 0 ;i--)//APPAPTAPPAPT
{
if(s[i] == 'A')
dp_1[i] = dp[i+1] + dp_1[i+1];
else
dp_1[i] = dp_1[i+1];
}
for(int i = 0; i < s.length(); i++)
{
if(s[i]=='P')
ans = (ans%p + dp_1[i+1]%p)%p;
}
cout<<ans;
return 0;
}