#38531: 分享一下自己的寫法


youtong826 (Youtong0826)

學校 : 高雄市立高雄高級工業職業學校
編號 : 231250
來源 : [180.217.209.78]
最後登入時間 :
2024-05-02 22:16:00
c462. apcs 交錯字串 (Alternating Strings) -- apcs | From: [180.217.119.127] | 發表日期 : 2023-12-03 21:00

// 題目的要求是從一段字串裡面找出 大小寫交錯且長度固定為k的字串
// (這裡指的的子字串為其中固定為大寫或小寫的部分
// 以下為作法
#include <bits/stdc++.h>
using namespace std;

int main(){
    ios::sync_with_stdio(0); //優化IO
    cin.tie(0); cout.tie(0);

    int k, n = 1, a = 0, ans = 0; // n 為紀錄連續子字串的長度 a 為串接各字串後的長度 ans 為比對所有長度後的最大長度
    string s;
    cin >> k >> s;

   
    bool lt = !isupper(s[0]); // 上個子字串的大小寫 (就像 aa BB aa 為 0 1 0)

    for (unsigned i = 1; i < s.size(); i++){ // 遍歷字串
        bool last = isupper(s[i-1]); // 上個字元的大小寫 (大寫為1 小寫為 0)
        bool now = isupper(s[i]); // 該字元的大小寫
        if (last == now){ // 如果跟上個字元相等
            if (n < k)
                n++;
           
            else if (a > k){ // 當 n >= k 也就是超出k的大小時 如果子字串的數量大於 1(子字串的數量 = a / k, 1 = k / k)
                n = k;
                a = k;
            }

        }
       
        else{ // 如果跟上個字元不相等
            if (n != k) // 如果 n != k 的話就代表不符合 所以 a = 0
                a = 0;
           
            n = 1; // 重設 n
            lt = last; // 重設 lt
        }

        if (n == k && lt != now){ // 如果子字串長與k相等且這個子字串的大小寫跟上個子字串不相等 就代表符合 所以總長度增加並重設 lt
            a += k;
            lt = now;
        }
       
        ans = max(ans, a); // 找出最大的 a
    }

    cout << ((s.size() == 1)? 1: ans); // s 的長度有可能為 1
}
 
ZeroJudge Forum