题目内容:
字符串 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
结尾无空行
解题思路:
1.直接暴力会出现超时,本题最后两个测试点的用例应该很大,故本题的时间复杂度需要保持在O(n)以下,如果出现双层循环(即O(n^2))则会出现超时。
2.解决超时问题之后,对于结果count需要每次对 1000000007 取余数,最后对于1000000007 取余数的话,count的结果可能会溢出。
Java代码实现:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
int len = str.length(), result = 0, countp = 0, countt = 0;
for (int i = 0; i < len; i++) { //先统计字符串中T的个数
if (str.charAt(i) == 'T')
countt++;
}
for (int i = 0; i < len; i++) {
if (str.charAt(i) == 'P') //遇到大P,P的个数+1
countp++;
if (str.charAt(i) == 'T') //遇到大T,T的个数-1
countt--;
if (str.charAt(i) == 'A') //遇到大A,计算当前PAT的个数+之前PAT的个数
result = (result + (countp * countt) % 1000000007) % 1000000007;
}
System.out.println(result);
}
}