-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path2375-ConstructSmallestNumberFromDIString.go
More file actions
69 lines (60 loc) · 2.62 KB
/
2375-ConstructSmallestNumberFromDIString.go
File metadata and controls
69 lines (60 loc) · 2.62 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package main
// 2375. Construct Smallest Number From DI String
// You are given a 0-indexed string pattern of length n consisting of the characters 'I' meaning increasing and 'D' meaning decreasing.
// A 0-indexed string num of length n + 1 is created using the following conditions:
// num consists of the digits '1' to '9', where each digit is used at most once.
// If pattern[i] == 'I', then num[i] < num[i + 1].
// If pattern[i] == 'D', then num[i] > num[i + 1].
// Return the lexicographically smallest possible string num that meets the conditions.
// Example 1:
// Input: pattern = "IIIDIDDD"
// Output: "123549876"
// Explanation:
// At indices 0, 1, 2, and 4 we must have that num[i] < num[i+1].
// At indices 3, 5, 6, and 7 we must have that num[i] > num[i+1].
// Some possible values of num are "245639871", "135749862", and "123849765".
// It can be proven that "123549876" is the smallest possible num that meets the conditions.
// Note that "123414321" is not possible because the digit '1' is used more than once.
// Example 2:
// Input: pattern = "DDD"
// Output: "4321"
// Explanation:
// Some possible values of num are "9876", "7321", and "8742".
// It can be proven that "4321" is the smallest possible num that meets the conditions.
// Constraints:
// 1 <= pattern.length <= 8
// pattern consists of only the letters 'I' and 'D'.
import "fmt"
import "strconv"
func smallestNumber(pattern string) string {
res, n, stack := "", len(pattern), []int{}
for i := 0; i <= n; i++ {
stack = append(stack, i + 1)
if i == n || pattern[i] == 'I' {
for len(stack) > 0 {
res += strconv.Itoa(stack[len(stack) - 1])
stack = stack[:len(stack) - 1]
}
}
}
return res
}
func main() {
// Example 1:
// Input: pattern = "IIIDIDDD"
// Output: "123549876"
// Explanation:
// At indices 0, 1, 2, and 4 we must have that num[i] < num[i+1].
// At indices 3, 5, 6, and 7 we must have that num[i] > num[i+1].
// Some possible values of num are "245639871", "135749862", and "123849765".
// It can be proven that "123549876" is the smallest possible num that meets the conditions.
// Note that "123414321" is not possible because the digit '1' is used more than once.
fmt.Println(smallestNumber("IIIDIDDD")) // "123549876"
// Example 2:
// Input: pattern = "DDD"
// Output: "4321"
// Explanation:
// Some possible values of num are "9876", "7321", and "8742".
// It can be proven that "4321" is the smallest possible num that meets the conditions.
fmt.Println(smallestNumber("DDD")) // "4321"
}