[杨小白]_leetcode_第306场周赛-第三题6150. 根据模式串构造最小数字

151 阅读4分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第23天,点击查看活动详情

前言

小白算法比较菜,希望能激励我每日更新,从leetcode第一题开始,2022年目标300题,记录从0到1的全过程!!

第306场周赛-力扣

第306场周赛-力扣

306的第三题,我感觉要用DFS遍历,但是尝试了很久都没写出来。事后看别人大佬的题解发现有更简便的方法。

第四题就只能是干瞪眼了,题解都看不懂,难顶啊!!!

现在介绍这个题。

6150. 根据模式串构造最小数字

给你下标从 0 开始、长度为 n 的字符串 pattern ,它包含两种字符,'I' 表示 上升 ,'D' 表示 下降 。

你需要构造一个下标从 0 开始长度为 n + 1 的字符串,且它要满足以下条件:

num 包含数字 '1' 到 '9' ,其中每个数字 至多 使用一次。

如果 pattern[i] == 'I' ,那么 num[i] < num[i + 1] 。

如果 pattern[i] == 'D' ,那么 num[i] > num[i + 1] 。

请你返回满足上述条件字典序 最小 的字符串 num。 、

示例 1

输入:pattern = "IIIDIDDD"

输出:"123549876"

解释:

下标 0 ,1 ,2 和 4 处,我们需要使 num[i] < num[i+1] 。

下标 3 ,5 ,6 和 7 处,我们需要使 num[i] > num[i+1] 。

一些可能的 num 的值为 "245639871" ,"135749862" 和 "123849765" 。

"123549876" 是满足条件最小的数字。

注意,"123414321" 不是可行解因为数字 '1' 使用次数超过 1 次。

示例 2

输入:pattern = "DDD"

输出:"4321"

解释:

一些可能的 num 的值为 "9876" ,"7321" 和 "8742" 。

"4321" 是满足条件最小的数字。

提示:

  • 1 <= pattern.length <= 8
  • pattern 只包含字符 'I' 和 'D'

2.解法

class Solution {
    public String smallestNumber(String pattern) {
        int[] res = new int[pattern.length()+1];
        for(int i = 0; i <res.length; i++) {
            res[i] = i + 1;
        }
        int index= 0;
        int start = 0;
        int end = 0;
        while(index<pattern.length()) {
            while (index<pattern.length()&&pattern.charAt(index)=='I') {
                index++;
            }
            start = index;
            while (index<pattern.length()&&pattern.charAt(index)=='D') {
                index++;
            }
            end = index;
            reverse(res,start,end);
        }
        StringBuffer sb = new StringBuffer();
        for(int i = 0; i < res.length; i++) {
            sb.append(res[i]);
        }
        return sb.toString();
    }
    public void reverse(int[] res, int start, int end) {
        while(start<end) {
            int t = res[start];
            res[start] = res[end];
            res[end] = t;
            start++;
            end--;
        }
    }
}

解析

这个题我本以为用dfs可以做,就是每次放入一个数字,然后深度遍历,如果找到了就直接返回,没找到就去查找别的。

也可能是我基本功不行把,写不出来。

大佬的做法非常的浅显易懂。这里我拿题目给的例子进行解释一下大家就明白了。

示例1 中 pattern = "IIIDIDDD",pattern有8个字符,那就说明返回的值有9个数,分别是123456789,从第一个到第四个是递增,第四个第五个是递减,所以呢,就把第四个第五个reverse一下 变成12354,后面同理46789中,第二个是增,后面345个是减,所以把第2个到5个reverse一下变成49876,所以最后就是123549876.

示例2中 pattern="DDD"三个字符,返回值就有四个值1234,从0到4个值都是减,所以把0到4都reverse一下变成4321就可以了

再给个例子 pattern = "DDIIDID" 七个字符,返回值有8个数,12345678,0到3个数都是递减,所以把0-3reverse一下变成321,第五个到第六个是递减,所以把5和6reverse变成65,第七个和第八个是递减,所以把7和8reverse一下变成87,连起来就是32146587,就是题目要求的答案了。

第一题链接如下

杨小白_leetcode_第306场周赛-第一题2373. 矩阵中的

第二题链接如下

[杨小白]_leetcode_第306场周赛-第二题6149. 边积分最高的节点

3.结束

这个题作为三题,有自己特殊的解法,但是dfs应该也是能做出来的,还是自己太菜了,刷题刷题,每天一道,三年1000道!!!!