Skip to content

Commit bfc8ad5

Browse files
committed
feat: add solutions to lc problem: No.0664
No.0664.Strange Printer
1 parent 71c1018 commit bfc8ad5

File tree

6 files changed

+296
-6
lines changed

6 files changed

+296
-6
lines changed

solution/0600-0699/0664.Strange Printer/README.md

+121-1
Original file line numberDiff line numberDiff line change
@@ -45,22 +45,142 @@
4545

4646
<!-- 这里可写通用的实现逻辑 -->
4747

48+
**方法一:动态规划**
49+
50+
定义 `dp[i][j]` 表示打印区间 `[i, j]` 所需的最少打印次数。当 `i == j` 时,`dp[i][j] = 1`,即只有一个字符,只需打印一次。答案为 `dp[0][n - 1]`
51+
52+
如果 `s[i] == s[j]`,则 `dp[i][j] = dp[i][j - 1]`;否则,`dp[i][j] = min(dp[i][k] + dp[k + 1][j])`,其中 `i <= k < j`
53+
54+
时间复杂度 $O(n^3)$,空间复杂度 $O(n^2)$。其中 $n$ 为字符串 `s` 的长度。
55+
4856
<!-- tabs:start -->
4957

5058
### **Python3**
5159

5260
<!-- 这里可写当前语言的特殊实现逻辑 -->
5361

5462
```python
55-
63+
class Solution:
64+
def strangePrinter(self, s: str) -> int:
65+
n = len(s)
66+
dp = [[inf] * n for _ in range(n)]
67+
for i in range(n - 1, -1, -1):
68+
dp[i][i] = 1
69+
for j in range(i + 1, n):
70+
if s[i] == s[j]:
71+
dp[i][j] = dp[i][j - 1]
72+
else:
73+
for k in range(i, j):
74+
dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + 1][j])
75+
return dp[0][-1]
5676
```
5777

5878
### **Java**
5979

6080
<!-- 这里可写当前语言的特殊实现逻辑 -->
6181

6282
```java
83+
class Solution {
84+
public int strangePrinter(String s) {
85+
int n = s.length();
86+
int[][] f = new int[n + 1][n + 1];
87+
for (int i = 0; i < n; ++i) {
88+
f[i][i] = 1;
89+
}
90+
for (int i = n - 2; i >= 0; --i) {
91+
for (int j = i + 1; j < n; ++j) {
92+
f[i][j] = 1 + f[i + 1][j];
93+
for (int k = i + 1; k <= j; ++k) {
94+
if (s.charAt(i) == s.charAt(k)) {
95+
f[i][j] = Math.min(f[i][j], f[i + 1][k] + f[k + 1][j]);
96+
}
97+
}
98+
}
99+
}
100+
return f[0][n - 1];
101+
}
102+
}
103+
```
104+
105+
```java
106+
class Solution {
107+
public int strangePrinter(String s) {
108+
int n = s.length();
109+
int[][] dp = new int[n][n];
110+
for (int i = n - 1; i >= 0; --i) {
111+
dp[i][i] = 1;
112+
for (int j = i + 1; j < n; ++j) {
113+
if (s.charAt(i) == s.charAt(j)) {
114+
dp[i][j] = dp[i][j - 1];
115+
} else {
116+
dp[i][j] = 10000;
117+
for (int k = i; k < j; ++k) {
118+
dp[i][j] = Math.min(dp[i][j], dp[i][k] + dp[k + 1][j]);
119+
}
120+
}
121+
}
122+
}
123+
return dp[0][n - 1];
124+
}
125+
}
126+
```
127+
128+
### **C++**
129+
130+
```cpp
131+
class Solution {
132+
public:
133+
int strangePrinter(string s) {
134+
int n = s.size();
135+
vector<vector<int>> dp(n, vector<int>(n, INT_MAX));
136+
for (int i = n - 1; i >= 0; --i) {
137+
dp[i][i] = 1;
138+
for (int j = i + 1; j < n; ++j) {
139+
if (s[i] == s[j]) {
140+
dp[i][j] = dp[i][j - 1];
141+
} else {
142+
for (int k = i; k < j; ++k) {
143+
dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + 1][j]);
144+
}
145+
}
146+
}
147+
}
148+
return dp[0][n - 1];
149+
}
150+
};
151+
```
63152
153+
### **Go**
154+
155+
```go
156+
func strangePrinter(s string) int {
157+
n := len(s)
158+
dp := make([][]int, n)
159+
for i := range dp {
160+
dp[i] = make([]int, n)
161+
}
162+
for i := n - 1; i >= 0; i-- {
163+
dp[i][i] = 1
164+
for j := i + 1; j < n; j++ {
165+
if s[i] == s[j] {
166+
dp[i][j] = dp[i][j-1]
167+
} else {
168+
dp[i][j] = 10000
169+
for k := i; k < j; k++ {
170+
dp[i][j] = min(dp[i][j], dp[i][k]+dp[k+1][j])
171+
}
172+
}
173+
}
174+
}
175+
return dp[0][n-1]
176+
}
177+
178+
func min(a, b int) int {
179+
if a < b {
180+
return a
181+
}
182+
return b
183+
}
64184
```
65185

66186
### **...**

solution/0600-0699/0664.Strange Printer/README_EN.md

+113-1
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,125 @@
4545
### **Python3**
4646

4747
```python
48-
48+
class Solution:
49+
def strangePrinter(self, s: str) -> int:
50+
n = len(s)
51+
dp = [[inf] * n for _ in range(n)]
52+
for i in range(n - 1, -1, -1):
53+
dp[i][i] = 1
54+
for j in range(i + 1, n):
55+
if s[i] == s[j]:
56+
dp[i][j] = dp[i][j - 1]
57+
else:
58+
for k in range(i, j):
59+
dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + 1][j])
60+
return dp[0][-1]
4961
```
5062

5163
### **Java**
5264

5365
```java
66+
class Solution {
67+
public int strangePrinter(String s) {
68+
int n = s.length();
69+
int[][] f = new int[n + 1][n + 1];
70+
for (int i = 0; i < n; ++i) {
71+
f[i][i] = 1;
72+
}
73+
for (int i = n - 2; i >= 0; --i) {
74+
for (int j = i + 1; j < n; ++j) {
75+
f[i][j] = 1 + f[i + 1][j];
76+
for (int k = i + 1; k <= j; ++k) {
77+
if (s.charAt(i) == s.charAt(k)) {
78+
f[i][j] = Math.min(f[i][j], f[i + 1][k] + f[k + 1][j]);
79+
}
80+
}
81+
}
82+
}
83+
return f[0][n - 1];
84+
}
85+
}
86+
```
87+
88+
```java
89+
class Solution {
90+
public int strangePrinter(String s) {
91+
int n = s.length();
92+
int[][] dp = new int[n][n];
93+
for (int i = n - 1; i >= 0; --i) {
94+
dp[i][i] = 1;
95+
for (int j = i + 1; j < n; ++j) {
96+
if (s.charAt(i) == s.charAt(j)) {
97+
dp[i][j] = dp[i][j - 1];
98+
} else {
99+
dp[i][j] = 10000;
100+
for (int k = i; k < j; ++k) {
101+
dp[i][j] = Math.min(dp[i][j], dp[i][k] + dp[k + 1][j]);
102+
}
103+
}
104+
}
105+
}
106+
return dp[0][n - 1];
107+
}
108+
}
109+
```
110+
111+
### **C++**
112+
113+
```cpp
114+
class Solution {
115+
public:
116+
int strangePrinter(string s) {
117+
int n = s.size();
118+
vector<vector<int>> dp(n, vector<int>(n, INT_MAX));
119+
for (int i = n - 1; i >= 0; --i) {
120+
dp[i][i] = 1;
121+
for (int j = i + 1; j < n; ++j) {
122+
if (s[i] == s[j]) {
123+
dp[i][j] = dp[i][j - 1];
124+
} else {
125+
for (int k = i; k < j; ++k) {
126+
dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + 1][j]);
127+
}
128+
}
129+
}
130+
}
131+
return dp[0][n - 1];
132+
}
133+
};
134+
```
54135
136+
### **Go**
137+
138+
```go
139+
func strangePrinter(s string) int {
140+
n := len(s)
141+
dp := make([][]int, n)
142+
for i := range dp {
143+
dp[i] = make([]int, n)
144+
}
145+
for i := n - 1; i >= 0; i-- {
146+
dp[i][i] = 1
147+
for j := i + 1; j < n; j++ {
148+
if s[i] == s[j] {
149+
dp[i][j] = dp[i][j-1]
150+
} else {
151+
dp[i][j] = 10000
152+
for k := i; k < j; k++ {
153+
dp[i][j] = min(dp[i][j], dp[i][k]+dp[k+1][j])
154+
}
155+
}
156+
}
157+
}
158+
return dp[0][n-1]
159+
}
160+
161+
func min(a, b int) int {
162+
if a < b {
163+
return a
164+
}
165+
return b
166+
}
55167
```
56168

57169
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
class Solution {
2+
public:
3+
int strangePrinter(string s) {
4+
int n = s.size();
5+
vector<vector<int>> dp(n, vector<int>(n, INT_MAX));
6+
for (int i = n - 1; i >= 0; --i) {
7+
dp[i][i] = 1;
8+
for (int j = i + 1; j < n; ++j) {
9+
if (s[i] == s[j]) {
10+
dp[i][j] = dp[i][j - 1];
11+
} else {
12+
for (int k = i; k < j; ++k) {
13+
dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + 1][j]);
14+
}
15+
}
16+
}
17+
}
18+
return dp[0][n - 1];
19+
}
20+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
func strangePrinter(s string) int {
2+
n := len(s)
3+
dp := make([][]int, n)
4+
for i := range dp {
5+
dp[i] = make([]int, n)
6+
}
7+
for i := n - 1; i >= 0; i-- {
8+
dp[i][i] = 1
9+
for j := i + 1; j < n; j++ {
10+
if s[i] == s[j] {
11+
dp[i][j] = dp[i][j-1]
12+
} else {
13+
dp[i][j] = 10000
14+
for k := i; k < j; k++ {
15+
dp[i][j] = min(dp[i][j], dp[i][k]+dp[k+1][j])
16+
}
17+
}
18+
}
19+
}
20+
return dp[0][n-1]
21+
}
22+
23+
func min(a, b int) int {
24+
if a < b {
25+
return a
26+
}
27+
return b
28+
}

solution/0600-0699/0664.Strange Printer/Solution.java

+1-4
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
class Solution {
22
public int strangePrinter(String s) {
3-
if (s.isEmpty()) {
4-
return 0;
5-
}
63
int n = s.length();
74
int[][] f = new int[n + 1][n + 1];
85
for (int i = 0; i < n; ++i) {
@@ -20,4 +17,4 @@ public int strangePrinter(String s) {
2017
}
2118
return f[0][n - 1];
2219
}
23-
}
20+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
class Solution:
2+
def strangePrinter(self, s: str) -> int:
3+
n = len(s)
4+
dp = [[inf] * n for _ in range(n)]
5+
for i in range(n - 1, -1, -1):
6+
dp[i][i] = 1
7+
for j in range(i + 1, n):
8+
if s[i] == s[j]:
9+
dp[i][j] = dp[i][j - 1]
10+
else:
11+
for k in range(i, j):
12+
dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + 1][j])
13+
return dp[0][-1]

0 commit comments

Comments
 (0)