ZeroJudge E837: 字母排列 (Letters)

現在是個國際化的社會,小乖的父母希望讓孩子從小就沉浸在英語的環境中。他今年五 歲,雙語幼稚園的老師正在訓練大家能夠將英文字母 A~Z 照順序背出來,小乖很快就能背 誦完整的 26 個字母了,但卻總是會背錯順序。老師發現其他小朋友也有這個問題,於是出 了一份考卷,其中包含一長串的英文字母,希望小朋友找到這串字母中最長的照順序排列字串,並寫出它的長度。 例如:在 abcwkodvwxyzwia 中有 abc 和 vwxyz 是按照順序的,最長的字串為 vwxyz,其 長度為 5。老師現在已經隨機產生出了一些字串,請你幫忙寫出一份解答,讓小朋友能夠快 樂學英文!

※ 注意:反序排列字串不算,如 zyxab 則只有 ab 符合照順序排列的條件。

範例測資

範例輸入範例輸出
輸入一行由 N (0 < N < 10,000) 個小寫字母所組成的字串。輸出一個正整數 M (1 <= M <= N) 代表最長有序子字串長度,接著輸出一個長度為 M 的英 文字串,代表最長有序子字串,無換行字元。 若有多個長度最長的字串,輸出最後一個出現的最長子字串若無任兩個相鄰字母照順 序排列,則最長有序子字串長度為 1。
abcwkodvwxyzwia5 vwxyz
gfeabuvstyzijo2 ij
apple1 e

解題思路

使用 ASCII Code 來確認字母是否為連續,跑字串的 For 迴圈,每次裡面跑目前位置 +1 到底的 For 迴圈,如果是連續的字母則將字母一直加到一個暫存的字串中,如果中斷了就 break 迴圈。之後和最長字串比較長度,如果「大於等於」就將答案字串設為新的字串。

範例程式碼-ZeroJudge E837: 字母排列 (Letters)

#include <iostream>
using namespace std;

int main() {
    cin.sync_with_stdio(0);
    cin.tie(0);
    string str, ans = "";
    cin >> str;
    for (int i = 0; i<str.length(); i++)
    {
        string tmp = "";
        tmp += str[i];
        int count = int(str[i]);
        for (int j = i+1; j<str.length(); j++)
        {
            if (int(str[j]) == count + 1)
            {
                count++;
                tmp += str[j];
            }
            else break;
        }
        if (tmp.length() >= ans.length()) ans = tmp;
    }
    cout << ans.length() << " " << ans << "\n";
}

//ZeroJudge E837
//Dr. SeanXD

發佈留言