字符串 APPAPT 中包含了两个单词 PAT,其中第一个 PAT 是第 2 位§,第 4 位(A),第 6 位(T);第二个 PAT 是第 3 位§,第 4 位(A),第 6 位(T)。
现给定字符串,问一共可以形成多少个 PAT?
输入格式:
输入只有一行,包含一个字符串,长度不超过105 ,只包含 P、A、T 三种字母。
输出格式:
在一行中输出给定字符串中包含多少个 PAT。由于结果可能比较大,只输出对 1000000007 取余数的结果。
输入样例:
APPAPT
输出样例:
2
一开始没整明白怎么做,后来去网上查了下别人的思路,也没想明白。
后面思考了很久才明白为什么要这么做,举个例子,如果一堆字符,里面只有pta三种字符,其中有x个P,y个A,z个T,问有多少种方式组合成“PAT”,答案是x*y*z种。
而这道题的过程就是求x*y*z,设三个数,cp,ca,ct分别代表P的数量,PA组合的数量,PAT组合的数量
x很好理解,从左往右,出现了多少个P,x就是多少,cp也就是多少。
y不好求,拿样例来说,我们很容易看出y应该是1,但是如果是AAAPAPAATTPAATPTPAAATPAAAAPPTAAATPAPAPTA(我随便打的)那么y应该是多少这个确实不好求,似乎也没有一个通式来表达。
但是x*y,也就是P和A总共有多少种组合我们可以求出来,那刚刚随便打的那个样例,当扫描到第一个P的时候,cp=1,继续扫描到下一个A,此时显而易见只有一种组合P1A1,继续到第二个P,此时cp=2,继续扫描到下一个A,此时有三种组合,其实就是P1A1 加上 P1A2,P2A2,一共三种组合,继续扫描到下一个A,此时的组合为P1A1,P1A2,P2A2 加上 P1A3,P2A3
发现规律了吗?当扫描到A的时候,P和A组合的数量为已有的PA组合的数量,再加上当前P的数量,即ca=ca+cp。对于T也是同理,ct=ca+cp
以上是我的理解,如果有错误的地方欢迎各位读者指正。
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
char[] s = bf.readLine().toCharArray();
int cp = 0, ca = 0, ct = 0;
for (int i = 0; i < s.length; i++) {
if (s[i] == 'P') {
cp++;
} else if (s[i] == 'A') {
ca = (ca + cp) % 1000000007;
} else {
ct = (ct + ca) % 1000000007;
}
}
out.print(ct);
out.flush();
}
}