字典序最小问题 (贪心)
输入:
n=6
S="ACDBCB"
输出:
ABCBCD
不断取S的开头和末尾中较小的一个字符放到T的末尾
1.按照字典序比较S和将S反转后的字符串'S'.
2.如果S较小,就从S的开头取出一个文字,追加到T的末尾.
3.如果S较小,就从S的末尾取出一个文字,追加到T的末尾.
1 const int MAX_N=100000; 2 3 int N; 4 char S[MAX_N]; 5 6 void solve() 7 { 8 int a=0,b=N-1; 9 while(a<=b){ 10 //将从左起和右起的字符串比较 11 bool left=false; 12 for(int i=0; a+i<=b; i++){ 13 if(S[a+i]<S[b-i]){ 14 left=true; 15 break; 16 } 17 else if(S[a+i]>S[b-i]){ 18 left=false; 19 break; 20 } 21 } 22 if(left) putchar(S[a++]); 23 else putchar(S[b--]); 24 } 25 }
<<挑战程序设计竞赛>>读后感