## 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 ; } ```