Algorithm:字典序最小问题

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;
}
原文地址:https://www.cnblogs.com/Luweir/p/14147358.html