字典序最小问题(贪心)

2023-05-06 16:33:21 浏览数 (2)

代码语言:javascript复制
#include <bits/stdc  .h>
using namespace std;
const int MAX_N = 2000;
/*
给定长度为N的字符窜S,要构造一个长度为N的字符串T。起初,T是一个空串,随后反复
进行下列任何操作。
1.从S的头部删除一个字符串,加到T的尾部
2.从S的尾部删除一个字符串,加到T的尾部
目标是要构造字典序尽可能小的字符串T。
限制条件:
1 ≤N ≤2000
字符串S只包含大写英文字母
输入:
N = 6
S = "ACDBCB"
输出:
ABCBCD(如下图所示进行操作) 

S="ACDBCB"  ==>(开头)  S="CDBCB" ==>(末尾)  S="CDBC"  ==>(末尾)  S="CDB"
T=""				   T="A"				T="AB"				 T="ABC"

==>(末尾) S="CD"	==>(开头)	S="D"		==>(开头)   S=""
		  T="ABCB"				T="ABCBC"				T="ABCBCD"

*/

int n;
char S[MAX_N   1];

void solve()
{
	int a = 0, b = n - 1;
	while (a <= b)
	{
		bool left = false;
		for (int i = 0; a   i <= b;   i)
		{
			if (S[a   i] < S[b - i])
			{
				left = true;
				break;
			}
			else if (S[a   i] > S[b - i]) // 如果相等,就进行下一轮循环,往内靠拢继续比较 
			{// 如果左边小,从开头开始取,反之从末尾开始取 
				left = false;
				break;
			}
		}
		if (left)	putchar(S[a  ]);
		else	putchar(S[b--]);
	}
}


int main()
{
	scanf("%d%*c", &n);
	gets(S);
	solve();
	return 0;
}

0 人点赞