練習題 No.4 字典序最小問題(貪心法)
阿新 • • 發佈:2019-02-13
要求
給定長度為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;
}