🔗 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
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
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
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)
}
}