LeetCode 2375. Construct Smallest Number From DI String

67 阅读1分钟

🔗 leetcode.com/problems/co…

题目

  • 给一个长度不超过 8 的字符串,由 D 和 I 两种字符
  • D 表示 nums[i] > nums[i+1],I 表示 nums[i] < nums[i+1]
  • nums 由 1-9 组成,返回满足规则的 nums 的最小字典序

思路

  • 思路 1,backtracing,按照字典枚举所有 1-9 的排列,判断当前排列是否满足 pattern 的规则。官方 hint,性能 5%
  • 思路 2,贪心,stack 依次加入 1-9,碰到 I 或者到长度的结尾就按照 stack 的 pop 组成 nums,碰到 D 就入 stack

代码

class Solution {
public:
    set<char> st;
    string ans;
    void dfs(string& pattern, int index, string prefix) {
        if (ans.size()) return;
        if (index > pattern.size()) {
            bool check = true;
            for (int i = 0; i < pattern.size(); i++) {
                if (pattern[i] == 'D') {
                    if (prefix[i] < prefix[i+1]) {
                        check = false;
                        break;
                    }
                } else {
                    if (prefix[i] > prefix[i+1]) {
                        check = false;
                        break;
                    }
                }
            }
            if (check) ans = prefix;
            return;
        }

        for (int i = 1; i < 10; i++) {
            char ch = '0' + i;
            if (st.count(ch)) continue;
            st.insert(ch);
            dfs(pattern, index+1, prefix+ch);
            st.erase(ch);
        }
        
    }
    string solution1(string& pattern) {
        dfs(pattern, 0, "");
        return ans;
    }

    string solution2(string& pattern) {
        stack<int> st;
        string ans;
        for (int i = 0; i <= pattern.size(); i++) {
            st.push(i + 1);

            while (pattern[i] == 'I' && !st.empty()) {
                ans.push_back('0' + st.top());
                st.pop();
            }

            while (i == pattern.size() && !st.empty()) {
                ans.push_back('0' + st.top());
                st.pop();
            }

        }
        return ans;

    }
    string smallestNumber(string pattern) {
        //return solution1(pattern);
        return solution2(pattern);
        
    }
};