現在是個國際化的社會,小乖的父母希望讓孩子從小就沉浸在英語的環境中。他今年五 歲,雙語幼稚園的老師正在訓練大家能夠將英文字母 A~Z 照順序背出來,小乖很快就能背 誦完整的 26 個字母了,但卻總是會背錯順序。老師發現其他小朋友也有這個問題,於是出 了一份考卷,其中包含一長串的英文字母,希望小朋友找到這串字母中最長的照順序排列字串,並寫出它的長度。 例如:在 abcwkodvwxyzwia 中有 abc 和 vwxyz 是按照順序的,最長的字串為 vwxyz,其 長度為 5。老師現在已經隨機產生出了一些字串,請你幫忙寫出一份解答,讓小朋友能夠快 樂學英文!
※ 注意:反序排列字串不算,如 zyxab 則只有 ab 符合照順序排列的條件。
範例測資
範例輸入 | 範例輸出 |
---|---|
輸入一行由 N (0 < N < 10,000) 個小寫字母所組成的字串。 | 輸出一個正整數 M (1 <= M <= N) 代表最長有序子字串長度,接著輸出一個長度為 M 的英 文字串,代表最長有序子字串,無換行字元。 若有多個長度最長的字串,輸出最後一個出現的最長子字串;若無任兩個相鄰字母照順 序排列,則最長有序子字串長度為 1。 |
abcwkodvwxyzwia | 5 vwxyz |
gfeabuvstyzijo | 2 ij |
apple | 1 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