題目連結: 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;
}
更新於 閱讀次數

用實際行動犒賞爆肝的我😀

Zrn Ye LinePay

LinePay