Skip to content

Commit 922d776

Browse files
committed
feat: add solutions to lc problem: No.1246
No.1246.Palindrome Removal
1 parent c9b768f commit 922d776

File tree

6 files changed

+327
-2
lines changed

6 files changed

+327
-2
lines changed

solution/1200-1299/1246.Palindrome Removal/README.md

+120-1
Original file line numberDiff line numberDiff line change
@@ -40,22 +40,141 @@
4040

4141
<!-- 这里可写通用的实现逻辑 -->
4242

43+
**方法一:动态规划(区间 DP)**
44+
45+
我们定义 $f[i][j]$ 表示删除下标区间 $[i,..j]$ 内的所有数字所需的最少操作次数。初始时 $f[i][i] = 1$,表示只有一个数字时,需要执行一次删除操作。
46+
47+
对于 $f[i][j]$,如果 $i + 1 = j$,即只有两个数字时,如果 $arr[i]=arr[j]$,则 $f[i][j] = 1$,否则 $f[i][j] = 2$。
48+
49+
对于超过两个数字的情况,如果 $arr[i]=arr[j]$,那么 $f[i][j]$ 可以取 $f[i + 1][j - 1]$,或者我们可以在下标范围 $[i,..j-1]$ 范围内枚举 $k$,取 $f[i][k] + f[k + 1][j]$ 的最小值。将最小值赋给 $f[i][j]$。
50+
51+
答案即为 $f[0][n - 1]$。
52+
53+
时间复杂度 $O(n^3)$,空间复杂度 $O(n^2)$。其中 $n$ 为数组长度。
54+
4355
<!-- tabs:start -->
4456

4557
### **Python3**
4658

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

4961
```python
50-
62+
class Solution:
63+
def minimumMoves(self, arr: List[int]) -> int:
64+
n = len(arr)
65+
f = [[0] * n for _ in range(n)]
66+
for i in range(n):
67+
f[i][i] = 1
68+
for i in range(n - 2, -1, -1):
69+
for j in range(i + 1, n):
70+
if i + 1 == j:
71+
f[i][j] = 1 if arr[i] == arr[j] else 2
72+
else:
73+
t = f[i + 1][j - 1] if arr[i] == arr[j] else inf
74+
for k in range(i, j):
75+
t = min(t, f[i][k] + f[k + 1][j])
76+
f[i][j] = t
77+
return f[0][n - 1]
5178
```
5279

5380
### **Java**
5481

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

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

61180
### **...**

solution/1200-1299/1246.Palindrome Removal/README_EN.md

+108-1
Original file line numberDiff line numberDiff line change
@@ -41,13 +41,120 @@
4141
### **Python3**
4242

4343
```python
44-
44+
class Solution:
45+
def minimumMoves(self, arr: List[int]) -> int:
46+
n = len(arr)
47+
f = [[0] * n for _ in range(n)]
48+
for i in range(n):
49+
f[i][i] = 1
50+
for i in range(n - 2, -1, -1):
51+
for j in range(i + 1, n):
52+
if i + 1 == j:
53+
f[i][j] = 1 if arr[i] == arr[j] else 2
54+
else:
55+
t = f[i + 1][j - 1] if arr[i] == arr[j] else inf
56+
for k in range(i, j):
57+
t = min(t, f[i][k] + f[k + 1][j])
58+
f[i][j] = t
59+
return f[0][n - 1]
4560
```
4661

4762
### **Java**
4863

4964
```java
65+
class Solution {
66+
public int minimumMoves(int[] arr) {
67+
int n = arr.length;
68+
int[][] f = new int[n][n];
69+
for (int i = 0; i < n; ++i) {
70+
f[i][i] = 1;
71+
}
72+
for (int i = n - 2; i >= 0; --i) {
73+
for (int j = i + 1; j < n; ++j) {
74+
if (i + 1 == j) {
75+
f[i][j] = arr[i] == arr[j] ? 1 : 2;
76+
} else {
77+
int t = arr[i] == arr[j] ? f[i + 1][j - 1] : 1 << 30;
78+
for (int k = i; k < j; ++k) {
79+
t = Math.min(t, f[i][k] + f[k + 1][j]);
80+
}
81+
f[i][j] = t;
82+
}
83+
}
84+
}
85+
return f[0][n - 1];
86+
}
87+
}
88+
```
89+
90+
### **C++**
91+
92+
```cpp
93+
class Solution {
94+
public:
95+
int minimumMoves(vector<int>& arr) {
96+
int n = arr.size();
97+
int f[n][n];
98+
memset(f, 0, sizeof f);
99+
for (int i = 0; i < n; ++i) {
100+
f[i][i] = 1;
101+
}
102+
for (int i = n - 2; i >= 0; --i) {
103+
for (int j = i + 1; j < n; ++j) {
104+
if (i + 1 == j) {
105+
f[i][j] = arr[i] == arr[j] ? 1 : 2;
106+
} else {
107+
int t = arr[i] == arr[j] ? f[i + 1][j - 1] : 1 << 30;
108+
for (int k = i; k < j; ++k) {
109+
t = min(t, f[i][k] + f[k + 1][j]);
110+
}
111+
f[i][j] = t;
112+
}
113+
}
114+
}
115+
return f[0][n - 1];
116+
}
117+
};
118+
```
50119
120+
### **Go**
121+
122+
```go
123+
func minimumMoves(arr []int) int {
124+
n := len(arr)
125+
f := make([][]int, n)
126+
for i := range f {
127+
f[i] = make([]int, n)
128+
f[i][i] = 1
129+
}
130+
for i := n - 2; i >= 0; i-- {
131+
for j := i + 1; j < n; j++ {
132+
if i+1 == j {
133+
f[i][j] = 2
134+
if arr[i] == arr[j] {
135+
f[i][j] = 1
136+
}
137+
} else {
138+
t := 1 << 30
139+
if arr[i] == arr[j] {
140+
t = f[i+1][j-1]
141+
}
142+
for k := i; k < j; k++ {
143+
t = min(t, f[i][k]+f[k+1][j])
144+
}
145+
f[i][j] = t
146+
}
147+
}
148+
}
149+
return f[0][n-1]
150+
}
151+
152+
func min(a, b int) int {
153+
if a < b {
154+
return a
155+
}
156+
return b
157+
}
51158
```
52159

53160
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
class Solution {
2+
public:
3+
int minimumMoves(vector<int>& arr) {
4+
int n = arr.size();
5+
int f[n][n];
6+
memset(f, 0, sizeof f);
7+
for (int i = 0; i < n; ++i) {
8+
f[i][i] = 1;
9+
}
10+
for (int i = n - 2; i >= 0; --i) {
11+
for (int j = i + 1; j < n; ++j) {
12+
if (i + 1 == j) {
13+
f[i][j] = arr[i] == arr[j] ? 1 : 2;
14+
} else {
15+
int t = arr[i] == arr[j] ? f[i + 1][j - 1] : 1 << 30;
16+
for (int k = i; k < j; ++k) {
17+
t = min(t, f[i][k] + f[k + 1][j]);
18+
}
19+
f[i][j] = t;
20+
}
21+
}
22+
}
23+
return f[0][n - 1];
24+
}
25+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
func minimumMoves(arr []int) int {
2+
n := len(arr)
3+
f := make([][]int, n)
4+
for i := range f {
5+
f[i] = make([]int, n)
6+
f[i][i] = 1
7+
}
8+
for i := n - 2; i >= 0; i-- {
9+
for j := i + 1; j < n; j++ {
10+
if i+1 == j {
11+
f[i][j] = 2
12+
if arr[i] == arr[j] {
13+
f[i][j] = 1
14+
}
15+
} else {
16+
t := 1 << 30
17+
if arr[i] == arr[j] {
18+
t = f[i+1][j-1]
19+
}
20+
for k := i; k < j; k++ {
21+
t = min(t, f[i][k]+f[k+1][j])
22+
}
23+
f[i][j] = t
24+
}
25+
}
26+
}
27+
return f[0][n-1]
28+
}
29+
30+
func min(a, b int) int {
31+
if a < b {
32+
return a
33+
}
34+
return b
35+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
class Solution {
2+
public int minimumMoves(int[] arr) {
3+
int n = arr.length;
4+
int[][] f = new int[n][n];
5+
for (int i = 0; i < n; ++i) {
6+
f[i][i] = 1;
7+
}
8+
for (int i = n - 2; i >= 0; --i) {
9+
for (int j = i + 1; j < n; ++j) {
10+
if (i + 1 == j) {
11+
f[i][j] = arr[i] == arr[j] ? 1 : 2;
12+
} else {
13+
int t = arr[i] == arr[j] ? f[i + 1][j - 1] : 1 << 30;
14+
for (int k = i; k < j; ++k) {
15+
t = Math.min(t, f[i][k] + f[k + 1][j]);
16+
}
17+
f[i][j] = t;
18+
}
19+
}
20+
}
21+
return f[0][n - 1];
22+
}
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
class Solution:
2+
def minimumMoves(self, arr: List[int]) -> int:
3+
n = len(arr)
4+
f = [[0] * n for _ in range(n)]
5+
for i in range(n):
6+
f[i][i] = 1
7+
for i in range(n - 2, -1, -1):
8+
for j in range(i + 1, n):
9+
if i + 1 == j:
10+
f[i][j] = 1 if arr[i] == arr[j] else 2
11+
else:
12+
t = f[i + 1][j - 1] if arr[i] == arr[j] else inf
13+
for k in range(i, j):
14+
t = min(t, f[i][k] + f[k + 1][j])
15+
f[i][j] = t
16+
return f[0][n - 1]

0 commit comments

Comments
 (0)