算法日常・每日刷题--<贪心>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;
    }
};
相关推荐
mmmmath_34 小时前
LeetCode.541.反转字符串II
数据结构·算法·leetcode
Navigator_Z4 小时前
LeetCode //MySQL - 1251. Average Selling Price
c语言·算法·leetcode
醇氧5 小时前
MySQL 8.0 系统表损坏与引擎转换故障排查实战
数据结构·算法
大熊背5 小时前
《Color constancy by characterization of illumination chromaticity》之色度色域最大化算法(二)
算法·白平衡·色度·色温
钓鱼的肝5 小时前
梳理(1-5)
c++·经验分享·笔记·算法·青少年编程
HZZD_HZZD6 小时前
CSDN_批发市场水电漏损归因算法LAM的原理与落地
嵌入式硬件·物联网·算法
shirsl7 小时前
算法 Day 5 树 / 二叉树 + DFS
数据结构·python·算法
木子算法8 小时前
非凸、离散、还耦合:论文里的求解方法是一条四步流水线
人工智能·算法·目标跟踪