E1. String Coloring (easy version)-Codeforces Round #617 (Div. 3)

E1. String Coloring (easy version)

题意:

给你一个字符串s由n个小写拉丁字母组成。你必须给它的所有字符涂上两种颜色中的一种(每个字符都要用一种颜色,相同的字母可以用相同或不同的颜色,也就是说,你可以为s中的每个索引选择一种颜色).
着色后,可以交换字符串中颜色不同的任意两个相邻字符。您可以任意(可能是零)次执行这样的操作。
目标是使字符串排序,即所有字符都应按字母顺序排列。
你的任务是说是否有可能给给定的字符串上色,这样在上色之后,它就可以按照一些交换序列进行排序。请注意,您只需恢复着色,而不必恢复交换序列。
如果无法为给定字符串上色,以便在上色后可以按交换序列排序,请在第一行打印“否”(不带引号)。
否则,在第一行打印“是”,在第二行打印任何正确的颜色(颜色是由n组成的字符串,如果第i个字符是第一种颜色,则第i个字符应为“0”,否则为“1”)。

解题思路:

上色后字符串s可被分为两种颜色的序列,本就按照字母顺序升序排列的字符不需要主动进行交换,将其颜色定为0,放在s1中,若s[i]<s1(逆序)且s[i]>s2,则s[i]颜色应为1,放在s2中,此时假设已进行过交换(通过交换前序列已升序排好(不一定只交换一次))s[i]颜色为0,继续比较;若s[i]小于s1,s2中尾字符,则即使交换了仍无法升序排列。NO;

代码

#include<iostream>
#include<string>
using namespace std;
int main()
{
	int n;string s,ss;char s1='a',s2='a';
	cin>>n>>s;
	for(int i=0;i<s.size();++i)
	{
		if(s[i]>=s1)
		{ss+='0';s1=s[i];
		}
		else if(s[i]>=s2)
		{ss+='1';s2=s[i];
		}
		else 
		{
		cout<<"NO";return 0;	
		}
	}cout<<"YES"<<endl;
	cout<<ss;
 } 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值