題目連結: https://zerojudge.tw/ShowProblem?problemid=c462
# 解題思路
先將同樣連續出現的大小寫的次數記錄下來,然後,再判斷連續出現的次數是否等於 k
- 等於 k 的話,就直接往下累加
- 小於 k 的話,就要直接重新開始計算
- 大於 k 的話,就只能加上 k 個,後面的就要重算囉
(怎麼感覺有 DP 的影子呢?)
# 程式碼
| #include <iostream> | |
| using namespace std; | |
| bool IsCap(char ch){ // 判斷字元是否為大寫 | |
| if(ch>='A'&&ch<='Z') | |
| return true; | |
|     else | |
| return false; | |
| } | |
| int main(){ | |
| int k; | |
|     string s; | |
| while(cin>>k){ | |
| cin>>s; | |
| int L=s.length(); | |
| if(L==1&&k==1){ | |
| cout<<1<<endl; | |
| continue; | |
|         } | |
| int Same[L]={-1}; | |
| int j=0; | |
| bool LastAph=IsCap(s[0]); // 判斷第一個字元 | |
| int sum=1; | |
| for(int i=1;i<L;i++)// 把同樣大小寫的字母類型記錄下來 | |
|         { | |
| if(IsCap(s[i])==LastAph) | |
| sum++; | |
|             else | |
|             { | |
| Same[j++]=sum; | |
| LastAph=IsCap(s[i]);// 重新判斷最初的字元 | |
| sum=1; | |
|             } | |
|         } | |
| Same[j]=sum; | |
| int ans=0; | |
| sum=0; | |
| for(int i=0;i<=j;i++) | |
|         { | |
| if(k>Same[i]){ | |
| if(sum>ans) | |
| ans=sum; | |
| sum=0; // 要把統計歸 0 | |
|             } | |
| else if(k==Same[i]){ | |
| sum+=k; // 長度相同,繼續累加 | |
| if(sum>ans) | |
| ans=sum; | |
|             } | |
| else if(k<Same[i]){ | |
| sum+=k; | |
| if(sum>ans) | |
| ans=sum; | |
| sum=k; // 要記錄到 k 個 | |
|             } | |
|         } | |
| cout<<ans<<endl; | |
|     } | |
| return 0; | |
| } | 
