1. 程式人生 > >練習題 No.4 字典序最小問題(貪心法)

練習題 No.4 字典序最小問題(貪心法)

要求

給定長度為N的字串S,要構造一個長度為N的字串T。起初,T是一個空串,隨後反覆進行下列任意操作。
1. 從S的頭部刪除一個字元,加到T的尾部。
2. 從S的尾部刪除一個字元,加到T的尾部

輸入格式

第一行輸入一行字串

輸出格式

輸出字串T

測試輸入

ACDBCB

測試輸出

ABCBCD

解題思路

此題用貪心法,從頭或者尾選一個較小的。
比較頭尾的二個字元大小,將加的移除到T中,如果相等,則進行下一個字元判斷,直到發現有大小不同的,如果全相同,則無論移除的是頭還是尾都一樣。

程式碼

#include<iostream> 
#include<string> #include<sstream> using namespace std; int main() { string str; string str2; getline(cin, str); ostringstream is(str2); int size = str.length(); int head = 0; int tail = size - 1; bool left = false; while ( head <= tail) { left = false
; for (int i = 0; head + i <= tail; i++) { if (str[head + i] < str[tail - i]) { left = true; break; } else if (str[head + i] > str[tail - i]){ left = false; break; } } if
(left) { is << str[head++]; } else { is << str[tail--]; } } cout << is.str() << endl; return 0; }