---
# System prepended metadata

title: CSES-Repetitions

---

## Repetitions
[題目連結](https://cses.fi/problemset/task/1069)
給定一個基因序，這裡用 string 表示，其中"只"包含 A、C、G、T 四個大寫英文字母
請你找出字串中相同字元並且連續出現的所有子字串 S1，並將 S1 中的最大長度輸出，範例如下行所示
ATTCGGGA => A、TT、C、GGG、A => GGG => 3

---

題目標籤 : 字串處理、迴圈、判斷
本題提示 : 
連續出現並且相同字元也可以解釋成 $n$ 個字元相鄰並且相同，如果把情況縮小到只有兩個相鄰的字元
就只要判斷是否相同即可，所以可以用判斷相鄰字元作為基礎，然後放大到多個字元

解題思路 :
延續提示的想法，在判斷字元時會出現兩種情況
1. 字元與上一個相同 => 當前 S1 長度 $+1$
2. 字元與上一個不相同 => 之前的 S1 結束，開新的 S1

接者就是針對這兩種情況作出更詳細的運算
因為我們還要知道所有 S1 當中最大長度為何，所以要在每次 S1 結束的時候做長度比較
```cpp=
int ans = 0, now = 1 ; // 最大長度、當前長度
for (int i=0;i<n;i++) {
    if (s[i] != s[i-1]) { // 不相同
        ans = max(ans, now) ; // 比較長度
        now = 1 ;             // 開新的 S1
    }
    ...
}
```
還有要注意的點是最後面的 S1 不會遇到 if，所以要額外判斷它的長度

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

int main() {
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0) ;

    string s ;
    cin >> s ;

    int now = 1, ans = 1, n = s.size() ; // 當前 S1 長度、最大長度、基因序長度
    for (int i=1;i<n;i++) {
        if (s[i] == s[i-1]) // 相同
            now++ ;          // 長度 + 1
        else {               // 不相同
            ans = max(ans, now) ; // 比較長度
            now = 1 ;              // 開新的 S1
        }
    }
    ans = max(ans, now) ; // 最後的一個 S1
    cout << ans << '\n' ;

    return 0 ;
}
```

