蓝桥杯2024年第十五届决赛真题-最小字符串 - C语言网 (dotcpp.com)
题解1 贪心
我把s2排个序,这样s2前面字典序就是最小的,我再往s1里面合适的位置插,这样整体得到的字符串就是字典序最小的.
需要注意的是s1和s2的长度不一样,也就是说最后可能s2往s1里插完了,s1还有剩余的部分.
或者s2还没插完s1就没了,那么我们就要把剩余的部分继续在末尾输出完.
#include<bits/stdc++.h>
using namespace std;
int n,m;
void solve()
{
cin>>n>>m;
string s1;string s2;cin>>s1>>s2;
sort(s2.begin(),s2.end());
int i=0,j=0;
while(i<n && j<m)
{
if(s1[i]<=s2[j])cout<<s1[i++];
else cout<<s2[j++];
}
while(i<n) cout<<s1[i++];
while(j<m) cout<<s2[j++];
}
int main()
{
solve();
return 0;
}
题解2 哈希
#include <bits/stdc++.h>
using namespace std;
int N,M;
string S;
char ch;
map<char ,int> mp;
void solve()
{
cin>>N>>M>>S;
for(int i=0;i<M;++i){
cin>>ch;
mp[ch]++;
}
auto it=mp.begin();
for(char i : S){
while(it != mp.end() && i > it->first){
cout<<string(it->second,it->first);
it++;
}
cout<<i;
}
while (it != mp.end()){
cout<<string(it->second,it->first);
it++;
}
}
signed main(){
solve();
return 0;
}