爱丽丝的卡片
时间:0.2s 空间:32M
题目描述:
爱丽丝有一个由小写字母构成的字符串,字符串被写在了墙上。
同时,她还有一堆卡片,每张卡片上写着一个字母,爱丽丝可以取出若干张卡片,覆盖墙上的一些字母。(也可以一张都不取)
她希望覆盖之后新的字符串字典序尽可能大。帮她找出覆盖之后字典序最大的字符串吧。
输入格式:
第一行输入一个字符串,表示墙上的字符串。
第二行输入一个字符串,表示爱丽丝手上拥有的字母。
输出格式:
输出一行,包含一个字符串
约定:
字符串长度<=50,都由小写字母构成
以下是该题的C++代码实现:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int main()
{
string wall, cards;
cin >> wall >> cards;
int freq[26] = {0}; // 存储字母频率的数组
for (char c : wall) {
freq[c - 'a']++;
}
string ans = wall;
for (char c : cards) {
freq[c - 'a']++;
string tmp = wall;
for (int i = 0; i < 26; i++) {
while (freq[i] > 0) {
tmp += (char)('a' + i);
freq[i]--;
}
}
ans = max(ans, tmp); // 更新最大字典序的字符串
}
cout << ans << endl;
return 0;
}
首先,我们读入墙上的字符串和爱丽丝手上的字母,然后使用一个长度为26的数组freq
来统计墙上字符串中每个字母出现的频率。接着,我们遍历爱丽丝手上的每个字母,将其加入数组freq
中,然后按照字典序从小到大的顺序重新构造字符串并更新最大字典序的字符串。最后输出最大字典序的字符串即可。
算法的时间复杂度为O(52nlogn),其中n为字符串长度,因为我们最多需要对两个长度为n的字符串进行排序(由于墙上的字符串和覆盖后的字符串的长度都不超过n,所以排序的时间复杂度为O(nlogn)),而排序的时间复杂度为O(nlogn),因此总时间复杂度为O(52nlogn)。算法的空间复杂度为O(26+n),其中n为字符串长度,因为我们需要使用一个长度为26的数组freq
来存储字母频率。