POJ3617-Best Cow Line

来源:互联网 发布:中科院半导体所 知乎 编辑:程序博客网 时间:2024/06/05 20:07

题目:

给定长度为N的字符串S 要构造一个长度为N的字符串T。起初,T是一个空串随后反复进行如下操作1:从S的头部删除一个字符串,加到T的末尾2:从S的尾部删除一个字符串 将其加到T的末尾其要求就是构造字典序尽可能小的字符串例如 S="ACDBCB" 》 S="CDBCB" 》 S=""S="CDBC" 》 S="CDB" 》S="CD"    》S="D"      》S=""     T=""       》T="A"      》T="AB"        》T="ABC"  》T="ABCB"  》T="ABCBC"  》T="ABCBCD"
个人理解:

以上过程可以看出 S在选择进入T中的过程中 总是比较S的开头和末尾的较小的字符串放到T末尾但是对于S的开头和末尾相同的情形需要注意在这种情况下 我们需要继续比较 S的第二位 与倒数第二位如果相同则继续比较 直到中间相遇之前如果能比较出来则直接比较 如果直到中间两者也是相同的 则去掉S的哪边都可以
代码<C语言>:
# include <stdio.h>void ZIDIAN(char S[],char T[]);# define N 100000int main(){char S[N],T[N];gets(S);ZIDIAN(S,T);printf("%s",T);return 0;}void ZIDIAN(char S[],char T[]){int i=0,A=0,B=-1,Flag=0,k=0;while(S[++B]);//求S的字符串长度B--;while(A<=B){while(S[A+i]==S[B-i])i++;T[k++]=(S[A+i]<S[B-i]?S[A++]:S[B--]);i=0;}T[k]='\0';}

原创粉丝点击