回溯 超时写法
#include<cstdio>
#include<cstring>
char str[4]="PAT";
char input[100010]={'\0'};
int count=0;
void backtrack(int i, int j, int n) {
if (j == 3) { // 找到了一个 "PAT" 子序列
count = (count + 1) % 1000000007;
return;
}
if (i >= n) {
return; // 超出字符串长度,结束回溯
}
// 选择当前字符
if (input[i] == str[j]) {
backtrack(i + 1, j + 1, n);
}
// 不选择当前字符
backtrack(i + 1, j, n);
}
int main(){
scanf("%s", input);
int n = strlen(input);
// dfs(0,0,n);
backtrack(0,0,n);
printf("%d\n", count);
}
常见写法:
#include<cstdio>
#include<cstring>
#define MOD 1000000007
char input[100010]={'\0'};
int leftPNum[100010]={0};
int main(){
scanf("%s", input);
int n = strlen(input);
for(int i=0;i<n;i++){ // 第i位及左边字符共包含了几个P
if(i>0&&input[i]=='P'){
leftPNum[i]=leftPNum[i-1]+1;
}else
leftPNum[i]=leftPNum[i-1];
if(i==0&&input[i]=='P'){
leftPNum[i]=1;
}
}
int ans = 0;
int rightTNum=0;
for(int i=n-1;i>=0;i--){
if(input[i]=='T')
rightTNum++;
if(input[i]=='A')
ans=(ans+leftPNum[i]*rightTNum)%MOD;
//💕💕💕 ans+=(leftPNum[i]*rightTNum)%MOD; 是错的!!!
}
printf("%d\n", ans);
}