Describe:
给一定长为N的字符串S,构造一个字符串T,长度也为N;
对于空串T,反复进行下列任意操作
1、从S的头部删除一个字符,加到T的尾部;
2、从S的尾部删除一个字符,加到T的尾部;
目标是生成的字符串T的字典序尽可能小;
字符串S只包含大写英文字母
Input:字符串S
Output:字符串T
Example:
Input: ACDBCB
Output:ABCBCD
Thinking:
即每次只需比较两端,取较小字符,若两端字符相等,则继续向内比较,取较小一端的若干个字符;
这里的一个技巧就是创建S的反转复制品S‘,这样就只要比较S和S‘左端的若干字符即可,在count达到字符串长度时返回结果即可;
S: A C D B C B
S’:B C B D C A
int main()
{
string s="ACDBCB", ss, t;
int len = s.size();
for (int i = len - 1; i >= 0; i--)//将s反转拷贝到ss中
{
ss.push_back(s[i]);
}
while (t.size() < len)
{
if (s.compare(ss) > 0)//s比ss大
{
t.push_back(ss[0]);
ss.erase(ss.begin()); //删除ss第一个元素
}
else
{
t.push_back(s[0]);
s.erase(s.begin());
}
}
cout << t << endl;
return 0;
}