題目連結: 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; | |
} |