【LeetCode】306c:根据模式串构造最小数字

306c:根据模式串构造最小数字


原题链接: 306c:根据模式串构造最小数字

题目大意

给你下标从 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。
示例:

输入: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 次。
输入: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 次。

数据范围:

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

思路

由数据范围知,答案字符串长度最多为9,长度为9的字符串根据全排列可知共有 9 ! = 362880 9!=362880 9!=362880种排列,因此可以暴力枚举。C++提供了next_permulation(str.begin(), str.end()) 函数来求解某一个排列的下一个排列(根据字典序)。

代码

class Solution {
public:
    string smallestNumber(string pattern) {
        int n = pattern.size();
        string res = "";
        for(int i = 1; i <= n + 1; i ++ ){ // 字典序的最小可能排列
            res += to_string(i);
        }
        
        while(true){
            bool flag = true; // 暴力枚举,判断当前排列是否满足
            for(int i = 0; i < n; i ++ ){
                if(pattern[i] == 'I' && res[i] > res[i + 1]) {
                    flag = false;
                    break;
                }
                else if(pattern[i] == 'D' && res[i] < res[i + 1]) {
                    flag = false;
                    break;
                }
            }
            
            if(flag) break; // 满足要求即返回字典序最小的字符串
            next_permutation(res.begin(), res.end()); // 否则判断下一个排列
        }
        
        return res;
        
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值