算法日常・每日刷题--<贪心>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;
    }
};
相关推荐
一去不复返的通信er9 小时前
力扣-图论-岛屿数量
算法·leetcode·图论
程序 代码狂人12 小时前
切片表与分区表的区别(数据开发面试版)
java·大数据·开发语言·数据仓库·算法
HDU-Dade13 小时前
【校招笔试真题】简要介绍 Self-Attention 的前沿算法
人工智能·算法
小郎君65815 小时前
Vue keep-alive 切标签后滚动位置回顶?因为 onDeactivated 里读到的 scrollTop 是 0
算法
邵奈一15 小时前
GPT-6.1 Terra速度是Sol的3倍,价格减半
算法
RaaS10015 小时前
Node.js Brotli RCE 漏洞自查指南:fetch、undici、axios 都在影响面,三分钟确认你的版本
人工智能·深度学习·算法
shehuiyuelaiyuehao16 小时前
算法56,重排链表
数据结构·算法·链表
qq_4523962317 小时前
第四篇:《索引原理与实战:B-tree、Hash、GIN、GiST、BRIN》
算法·哈希算法·gin
西索斯coding17 小时前
Qwen3-Max 与 Qwen-Plus:60 个真实修复任务评测方案
大数据·网络·算法·ai