1. 程式人生 > >1040. 有幾個PAT(25)

1040. 有幾個PAT(25)

字串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

///////////////

/////////////////
思路:這道題一開始我還覺得很簡單,不就是一個個遍歷嘛,找到P之後從後面字串找A,再從A後面字串找T,找到T之後count++。但是這樣重複遍歷了太多遍導致執行超時。後來參考了柳婼學姐的程式碼,效率高,理解也簡單,想法很巧妙。大致思路是:先遍歷一遍字串,數出’T’的個數countt;然後再從頭遍歷一遍,遇到P就countp++,遇到T就countt–,遇到A就令計數PAT的變數count+=countp*countt。這樣做的原因是:計算字串中每個字母A兩側的P和T的數量,P的數量與T的數量的乘積就是這個A所能組成的PAT數量,把所有A所能組成的PAT數量相加,就是總的PAT個數。

///////////////////////////////////////
PS: 以下注釋掉的部分就是我一開始執行超時的程式碼
//////////////////////////////////////

#include <iostream>
using namespace std;

int main()
{
    string s;
    long count=0,countt=0,countp=0;
    cin>>s;
//  for(int i=0;i<s.length()-2 ;i++){
//      if(s[i]=='P'){
//          for(int j=i+1;j<s.length()-1 ;j++){
//              if(s[j]=='A'){
//                  for(int k=j+1;k<s.length() ;k++){
// if(s[k]=='T') // count++; // } // } // } // } // } for(int i=0;i<s.length() ;i++){ if(s[i]=='T') countt++; } for(int i=0;i<s.length() ;i++){ if(s[i]=='P') countp++; if
(s[i]=='T') countt--; if(s[i]=='A') count += countp * countt; } cout<<count%1000000007; return 0; }