字符串拼接最小字典

给定一个字符串数组,找到一种拼接顺序,使得所有小字符串拼接成的大字符串在所有可能的拼接中字典序最小。

例如:给定strArr = {"bac", "bd"},n = 2。则有两种拼接顺序bacbd和bdbac,显然第一种拼接的字典序要小于第二种。


我们是否可以这样认为:如果str1的字典序小于str2的字典序,那么str1一定就放在前面,也就是str1+str2的字典序一定小于str2+str1的字典序呢?

看下面一个例子。

strArr = {"b", "ba"},如果按照上面的说法就应该是b的字典序小于ba的字典序,那么拼接后较小的字典序应该是bba。显然不正确,另一种拼接顺序bab的字典序是比bba要小的。

所以,不能单纯的按照单个字符串的字典序小就把它排在前面的思想。而是应该看二者之和的字典序的大小,也就是:

如果str1+str2  <  str2 + str1,则将str1放在前面,否则将str2放在前面。


code:

string maxDictionarySort(vector<string> vec, int n)
{
	sort(vec.begin(), vec.end(), cmp);
	string result = "";
	for(int i = 0; i < n; ++i)
		result += vec[i];
	return result;
}
//给字符串的排序规则
static bool cmp(string s1, string s2)
{
	return (s1 + s2) <= (s2 + s1) ? true : false;
}


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值