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;
}