开启我的LeetCode刷题日记:942. 增减字符串匹配

57 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第13天,点击查看活动详情

编程世界总是离不了算法

最近在看框架源码时,会有很多算法的实现逻辑,有时候会感到吃力

于是决定蹭着假期,加强算法和数据结构相关的知识

那怎么提升呢?

其实我知道算法这东西没有捷径,多写多练才能提升,于是我开启我的LeetCode刷题之旅

第一阶段目标是:200道,每天12

为了不乱,本系列文章目录分为三部分:

  1. 今日题目:xxx
  2. 我的思路
  3. 代码实现

今日题目:942. 增减字符串匹配

由范围 [0,n] 内所有整数组成的 n + 1 个整数的排列序列可以表示为长度为 n 的字符串 s ,其中:

如果 perm[i] < perm[i + 1] ,那么 s[i] == 'I'  如果 perm[i] > perm[i + 1] ,那么 s[i] == '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"

我的思路

首先看一下题意,简洁的描述,提供一个字符串,里边只有 I 和 D 两种字符,要求输出一个数组,长度是字符串的长度 + 1,内容是从 0 - 字符串的长度的所有数字, 顺序是根据字符串顺序 I D 两种字符,下一个比上一个大或小

然后观察一下示例提供的规律,先把提供的所有数字列出来,对比结果,会发现

如果当前字符是 I,数组中的值为当前结果集中最小的值

如果当前字符是 D,数组中的值为当前结果集中最大的值

最后一位是剩下的一个数字

由上发现的规律,采用双指针方法尝试

定义双指针min, max 存储当前最大值最小值

定义结果数组 arr

把 s 结尾拼一个,让字符串与结果相对,实际拼I 或者 D 都可以,因为通过这种方法最终 min 和 max只会差 1,不管是min + 1 还是 max - 1都是一样的

然后循环s ,根据其中的每一项,往结果数组中 Push max 或者 min 就可以了,相应的把 max-- 或者 min ++

代码实现

/**
 * @param {string} s
 * @return {number[]}
 */
var diStringMatch = function (s) {
  let arr = [];
  let min = 0;
  let max = s.length
  s += s[s.length - 1]
  for (let i = 0; i < s.length; i++) {
    if (s[i] === 'I') {
      arr.push(min)
      min++
    } else {
      arr.push(max)
      max--
    }
  }
  return arr
};

总结

实现方式其实有很多,这里仅供参考~

由于刚开始刷题,也不知道从哪里刷好,如果前辈们有好的建议,希望不吝赐教,感谢🌹