快轉到主要內容

CSES-1069 Repetitions

標籤: 字串
目錄

題目連結:https://cses.fi/problemset/task/1069


題意
#

題目會給我們一串 DNA 序列(也就是由 A、C、G、T 組成的字串)。
我們要找出這個字串裡面,連續出現同樣字元的最長長度是多少。

思路
#

這題其實是很經典的序列掃描問題。我們只要從頭到尾把字串看過一遍就可以了。

這中間只要維護兩個數字:一個紀錄目前這個字元連續出現了幾次,另一個紀錄歷史最大值。
在遍歷的時候,如果現在的字元跟前一個一模一樣,連續次數就加一;如果不一樣,代表換字元了,就把連續次數重置為 1。
每看一個字元就順手更新一下最大值,整個迴圈跑完答案自然就出來了。

程式碼
#

#include <bits/stdc++.h>
using namespace std;

#define pb push_back
#define fi first
#define se second
#define INF LONG_LONG_MAX/1000
#define WA() cin.tie(0)->sync_with_stdio(0)
#define all(x) (x).begin(), (x).end()
#define int long long
#define PII pair<int, int>

signed main() { WA();
    string s;
    cin >> s; // 讀取 DNA 序列字串
    
    int cnt = 1, mx = 1; // cnt 紀錄目前連續字元的長度,mx 紀錄歷史最大連續長度
    
    // 從第二個字元開始遍歷整個字串
    for (int i = 1; i < s.size(); i++) {
        if (s[i] == s[i-1]) cnt++; // 如果當前字元與前一個相同,連續長度加 1
        else cnt = 1;              // 如果不同,重置連續長度為 1
        
        mx = max(mx, cnt); // 隨時更新歷史最大連續長度
    }
    cout << mx; // 輸出最長連續長度
}
Piau 的筆記本
作者
Piau 的筆記本
希望我寫下來的東西能夠長久的記在我的腦中