算法日常・每日刷题--<贪心>14

942. 增减字符串匹配 - 力扣(LeetCode)942. 增减字符串匹配 - 由范围 0,n 内所有整数组成的 n + 1 个整数的排列序列可以表示为长度为 n 的字符串 s ,其中: * 如果 permi < permi + 1 ,那么 si == 'I' * 如果 permi > permi + 1 ,那么 si == 'D' 给定一个字符串 s ,重构排列 perm 并返回它。如果有多个有效排列perm,则返回其中 任何一个 。 示例 1:输入:s = "IDID"输出:0,4,1,3,2示例 2:输入:s = "III"输出:0,1,2,3示例 3:输入:s = "DDI"输出:3,2,0,1 提示: * 1 <= s.length <= 105 * s 只包含字符 "I" 或 "D"https://leetcode.cn/problems/di-string-match/

题目描述

给定只由 'I' (上升)和 'D' (下降)组成的字符串 s。

设 n = s.size(),需要构造一个 0 ~ n 的整数排列,满足:

  • s[i] == 'I' → ans[i] < ans[i+1]

  • s[i] == 'D' → ans[i] > ans[i+1]

返回任意一个合法排列即可。

解题思路(贪心核心)

这道题是非常经典的贪心模板题。

定义两个指针:

  • left = 0:当前可用最小值

  • right = n:当前可用最大值

贪心策略:

  1. 遇到 'I'(需要上升) :放当前最小值 left,小数用完,后面自然可以变大

  2. 遇到 'D'(需要下降) :放当前最大值 right,大数用完,后面自然可以变小

字符串遍历结束后,left == right,剩下最后一个数直接放入答案。

cpp 复制代码
class Solution {
public:
    vector<int> diStringMatch(string s) {
        int n=s.size();
        vector<int>ret;

        int left=0,right=n;
        for(auto e:s)
        {
            if(e=='I')
            ret.push_back(left++);
            else
            ret.push_back(right--);
        }
            ret.push_back(right);

        return ret;
    }
};
相关推荐
怕浪猫9 小时前
RAG 面试 6 连问,从原理到优化全部覆盖
python·算法·面试
无线通信科研笔记9 小时前
IEEE TVT 2026 论文精读与完整复现|相位误差如何重塑近场 RIS 的幅相响应
论文阅读·人工智能·python·算法·论文笔记
mmmmath_310 小时前
二叉树の递归遍历
算法
All for pursuit.10 小时前
【位运算-1】338.比特位计数
数据结构·c++·算法·leetcode
小师兄吃牛肉11 小时前
C语言中的nullptr有必要吗
c语言·c++·算法
一只小小的芙厨12 小时前
【线性DP】
学习·算法·动态规划
奋发向前wcx13 小时前
CSP-J复赛模拟赛5 王晨旭补题 2026.10.5
算法
罗湖老棍子14 小时前
C Looooops(信息学奥赛一本通- P1640)
算法·数论·同余·裴蜀定理·扩展欧几里得
飘尘17 小时前
从"算子"到"AI Infra":大模型背后看不见的那群人在忙什么
人工智能·算法·面试
夏幻灵17 小时前
每日一题:LeetCode 3:无重复字符的最长子串——滑动窗口思路详解
算法·leetcode·职场和发展