2024年蓝桥杯国赛B组最小字符串(洛谷P10910):贪心算法构造最小字符串

深度学习
• 阅读 4

2024年蓝桥杯国赛B组最小字符串(洛谷P10910):贪心算法构造最小字符串

一、问题描述

给定一个长度为N的字符串S和M个待插入字符,要求将这些字符全部插入到S中,使得最终形成的字符串字典序最小。

二、完整代码解析(含详细注释)

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

int main() {
    int N, M;
    string S, chars;

    // 读取输入
    cin >> N >> M;
    cin >> S;
    cin >> chars;

    // 将待插入字符排序,方便贪心选择
    sort(chars.begin(), chars.end());

    string result;
    int charIndex = 0;

    // 贪心策略:在能保持字典序最小的位置插入当前最小字符
    for (int i = 0; i < N; ++i) {
        // 当还有字符可插入,且当前字符比待插入字符大时
        while (charIndex < M && chars[charIndex] < S[i]) {
            result.push_back(chars[charIndex]);
            charIndex++;
        }
        result.push_back(S[i]);
    }

    // 插入剩余字符
    while (charIndex < M) {
        result.push_back(chars[charIndex]);
        charIndex++;
    }

    cout << result << endl;
    return 0;
}

三、算法核心思想

  1. ‌预处理阶段‌:
    • 对待插入字符排序(O(MlogM)时间)
    • 确保每次都能取到当前最小的可用字符
  2. ‌贪心策略‌:
    • 遍历原字符串时,只要当前待插入字符比原字符小就立即插入
    • 这种局部最优选择能保证全局最优解
  3. ‌边界处理‌:
    • 最后需要检查是否还有未插入的字符
    • 这些字符直接追加到结果字符串末尾

四、常见问题解答

Q:为什么需要先排序待插入字符?
A:排序后可以确保每次都能取出当前最小的可用字符,这是贪心策略的关键

Q:如何处理多个相同最小字符的情况?
A:排序后相同字符会相邻,算法会按顺序使用它们

Q:为什么最后要单独处理剩余字符?
A:可能存在所有待插入字符都比原字符串字符小的情况

来源:编程学习

点赞
收藏
评论区
推荐文章
DaLongggggg DaLongggggg
4年前
python百题大冲关-确定字符串是否是另一个的旋转
挑战介绍实现一个算法来识别一个字符串s2是否是另一个字符串s1的旋转。旋转的解释如下:如果将s1从某个位置断开,拆分成两个字符串(可能有一个为空字符串),再将这两个字符串调换顺序后拼接起来,能够得到s2,那么说字符串s2是字符串s1的旋转。本次挑战中,你需要在rotation.py文件中补充函数is_subst
Wesley13 Wesley13
3年前
Java面试总结(排序算法)
1.冒泡排序算法描述:两两比较,大的放后面2.选择排序算法描述:在m元数组中找到最小值的位置,然后将最小值的位置和第n(n0,1,2,....m1)位的值对调,排序k次则m元数组中前k(k<m)位的值已经排序好,m元数组中前k位的值不需要再进行排序,此时需要排序的元素只有mk个3.插入排序算
Wesley13 Wesley13
3年前
HDU 6345(子串查询 暴力)
题意是每组给定一个字符串,在有限查询次数内输出所要查询区间的字典序最小的子串个数。字典序最小的子串,就是所查询区间中字典序最小的单个字符,问题就转化成了求一段区间内字典序最小的字符个数。开始时盲目暴力,直接用桶排序的做法一段一段去求,果然t了(这种就不贴代码了)......然后想到先扫一遍,求出从字符串首位到第i位的最小字符数,再用一个数组存
Stella981 Stella981
3年前
LeetCode.1170
这是小川的第412次更新,第444篇原创<br/看题和准备今天介绍的是LeetCode算法题中Easy级别的第263题(顺位题号是1170)。在一个非空字符串s上定义一个函数f(s),该函数计算s中最小字符的出现频率。例如,如果s"dcce",则f(s)2,因为最
深度学习 深度学习
3星期前
2024蓝桥杯省赛B组前缀总分(洛谷P12124)解题思路与代码详解
一、题目解读2024年蓝桥杯省B组题目“前缀总分”(对应洛谷P12124)要求计算给定字符串集合中,所有前缀的最长公共前缀(LCP)的总分,并找出通过移动字符位置后可能获得的最大总分。题目考察字符串处理与动态规划能力,需高效计算LCP并优化得分策略。二、解
深度学习 深度学习
3星期前
2024年蓝桥杯国赛A组题 九宫格全解析:基于BFS算法的代码实现与优化
2024年蓝桥杯国赛A组题九宫格全解析:基于BFS算法的代码实现与优化蓝桥杯国赛九宫格问题BFS算法代码解析解题步骤第1张一、题目解读2024年蓝桥杯国A的九宫格题目(对应洛谷P10578)要求通过旋转九宫格中的2x2区域,实现从初始状态到目标状态的转换,
贾蔷 贾蔷
1星期前
2024蓝桥杯国赛B组最小字符串题解:贪心算法实战应用
一、题目解读题目要求给定一个长度为N的S和M个待插入字符,通过将这些字符全部插入S中,构造出最小的新字符串。这是典型的字符串构造问题,考察选手对的理解和应用能力。二、解题思路采用贪心策略:1.先将待插入字符,便于按字典序选择2.遍历原字符串时,在保证字典序
贾蔷 贾蔷
1个月前
2013 蓝桥杯 省赛B组 翻硬币(洛谷P8597题) 从暴力BFS到贪心算法的优化之路
一、问题背景与理解洛谷P8597是一道经典的翻硬币问题,题目描述如下:给定两个由''和'o'组成的字符串s1和s2,分别表示初始状态和目标状态。每次操作可以选择任意位置开始翻转连续的k个硬币(''变'o','o'变'')。要求计算出从初始状态变为目标状态所
贾蔷 贾蔷
1个月前
2025年GESP七级等价消除(洛谷P11965)代码解析与优化策略
一、题目解读2025年GESP七级考试中的“等价消除(洛谷P11965)”问题要求统计给定字符串中满足等价条件的子串数量。所谓“等价子串”,是指子串中所有字符出现的次数均相同。题目需要高效算法解决,考验对字符串处理和状态压缩的掌握。二、解题思路采用位运算
深度学习 深度学习
3星期前
洛谷1111题解:基于Kruskal算法与并查集的最小生成树实现
一、题目解读洛谷1111题是一道经典的图论问题,要求构建一个无向图的最小生成树,并输出其最大边权值。题目核心在于通过给定的边集合,找到连接所有节点的最小权值子集,同时保证无环。这通常涉及最小生成树算法(如Kruskal)的应用,需要高效处理边权重与节点连通