Skip to content

Commit 9c848b2

Browse files
committed
feat: add solutions to lc/lcof2 problems
lcof2 No.094 & lc No.0132.Palindrome Partitioning II
1 parent e4d23ee commit 9c848b2

File tree

11 files changed

+491
-19
lines changed

11 files changed

+491
-19
lines changed

lcof2/剑指 Offer II 094. 最少回文分割/README.md

+104-1
Original file line numberDiff line numberDiff line change
@@ -53,22 +53,125 @@
5353

5454
<!-- 这里可写通用的实现逻辑 -->
5555

56+
两次 dp,`dp1[i][j]` 表示 i ~ j 的子串是否是回文,可以参考 [5. 最长回文子串](../../solution/0000-0099/0005.Longest%20Palindromic%20Substring/README.md)`dp2[i]` 表示以 i 结尾的子串最少需要分割几次,如果本来就是回文串(`dp[0][i] == true`)就不需要分割,否则枚举分割点 `j`
57+
5658
<!-- tabs:start -->
5759

5860
### **Python3**
5961

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

6264
```python
63-
65+
class Solution:
66+
def minCut(self, s: str) -> int:
67+
n = len(s)
68+
dp1 = [[False] * n for _ in range(n)]
69+
for i in range(n - 1, -1, -1):
70+
for j in range(i, n):
71+
dp1[i][j] = s[i] == s[j] and (j - i < 3 or dp1[i + 1][j - 1])
72+
dp2 = [0] * n
73+
for i in range(n):
74+
if not dp1[0][i]:
75+
dp2[i] = i
76+
for j in range(1, i + 1):
77+
if dp1[j][i]:
78+
dp2[i] = min(dp2[i], dp2[j - 1] + 1)
79+
return dp2[-1]
6480
```
6581

6682
### **Java**
6783

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

7086
```java
87+
class Solution {
88+
public int minCut(String s) {
89+
int n = s.length();
90+
boolean[][] dp1 = new boolean[n][n];
91+
for (int i = n - 1; i >= 0; i--) {
92+
for (int j = i; j < n; j++) {
93+
dp1[i][j] = s.charAt(i) == s.charAt(j) && (j - i < 3 || dp1[i + 1][j - 1]);
94+
}
95+
}
96+
int[] dp2 = new int[n];
97+
for (int i = 0; i < n; i++) {
98+
if (!dp1[0][i]) {
99+
dp2[i] = i;
100+
for (int j = 1; j <= i; j++) {
101+
if (dp1[j][i]) {
102+
dp2[i] = Math.min(dp2[i], dp2[j - 1] + 1);
103+
}
104+
}
105+
}
106+
}
107+
return dp2[n - 1];
108+
}
109+
}
110+
```
111+
112+
### **Go**
113+
114+
```go
115+
func minCut(s string) int {
116+
n := len(s)
117+
dp1 := make([][]bool, n)
118+
for i := 0; i < n; i++ {
119+
dp1[i] = make([]bool, n)
120+
}
121+
for i := n - 1; i >= 0; i-- {
122+
for j := i; j < n; j++ {
123+
dp1[i][j] = s[i] == s[j] && (j-i < 3 || dp1[i+1][j-1])
124+
}
125+
}
126+
dp2 := make([]int, n)
127+
for i := 0; i < n; i++ {
128+
if !dp1[0][i] {
129+
dp2[i] = i
130+
for j := 1; j <= i; j++ {
131+
if dp1[j][i] {
132+
dp2[i] = min(dp2[i], dp2[j-1]+1)
133+
}
134+
}
135+
}
136+
}
137+
return dp2[n-1]
138+
}
139+
140+
func min(x, y int) int {
141+
if x < y {
142+
return x
143+
}
144+
return y
145+
}
146+
```
71147

148+
### **C++**
149+
150+
```cpp
151+
class Solution {
152+
public:
153+
int minCut(string s) {
154+
int n = s.size();
155+
vector<vector<bool>> dp1(n, vector<bool>(n));
156+
for (int i = n - 1; i >= 0; --i) {
157+
for (int j = i; j < n; ++j) {
158+
dp1[i][j] = s[i] == s[j] && (j - i < 3 || dp1[i + 1][j - 1]);
159+
}
160+
}
161+
vector<int> dp2(n);
162+
for (int i = 0; i < n; ++i) {
163+
if (!dp1[0][i]) {
164+
dp2[i] = i;
165+
for (int j = 1; j <= i; ++j) {
166+
if (dp1[j][i]) {
167+
dp2[i] = min(dp2[i], dp2[j - 1] + 1);
168+
}
169+
}
170+
}
171+
}
172+
return dp2[n - 1];
173+
}
174+
};
72175
```
73176
74177
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
class Solution {
2+
public:
3+
int minCut(string s) {
4+
int n = s.size();
5+
vector<vector<bool>> dp1(n, vector<bool>(n));
6+
for (int i = n - 1; i >= 0; --i) {
7+
for (int j = i; j < n; ++j) {
8+
dp1[i][j] = s[i] == s[j] && (j - i < 3 || dp1[i + 1][j - 1]);
9+
}
10+
}
11+
vector<int> dp2(n);
12+
for (int i = 0; i < n; ++i) {
13+
if (!dp1[0][i]) {
14+
dp2[i] = i;
15+
for (int j = 1; j <= i; ++j) {
16+
if (dp1[j][i]) {
17+
dp2[i] = min(dp2[i], dp2[j - 1] + 1);
18+
}
19+
}
20+
}
21+
}
22+
return dp2[n - 1];
23+
}
24+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
func minCut(s string) int {
2+
n := len(s)
3+
dp1 := make([][]bool, n)
4+
for i := 0; i < n; i++ {
5+
dp1[i] = make([]bool, n)
6+
}
7+
for i := n - 1; i >= 0; i-- {
8+
for j := i; j < n; j++ {
9+
dp1[i][j] = s[i] == s[j] && (j-i < 3 || dp1[i+1][j-1])
10+
}
11+
}
12+
dp2 := make([]int, n)
13+
for i := 0; i < n; i++ {
14+
if !dp1[0][i] {
15+
dp2[i] = i
16+
for j := 1; j <= i; j++ {
17+
if dp1[j][i] {
18+
dp2[i] = min(dp2[i], dp2[j-1]+1)
19+
}
20+
}
21+
}
22+
}
23+
return dp2[n-1]
24+
}
25+
26+
func min(x, y int) int {
27+
if x < y {
28+
return x
29+
}
30+
return y
31+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
class Solution {
2+
public int minCut(String s) {
3+
int n = s.length();
4+
boolean[][] dp1 = new boolean[n][n];
5+
for (int i = n - 1; i >= 0; i--) {
6+
for (int j = i; j < n; j++) {
7+
dp1[i][j] = s.charAt(i) == s.charAt(j) && (j - i < 3 || dp1[i + 1][j - 1]);
8+
}
9+
}
10+
int[] dp2 = new int[n];
11+
for (int i = 0; i < n; i++) {
12+
if (!dp1[0][i]) {
13+
dp2[i] = i;
14+
for (int j = 1; j <= i; j++) {
15+
if (dp1[j][i]) {
16+
dp2[i] = Math.min(dp2[i], dp2[j - 1] + 1);
17+
}
18+
}
19+
}
20+
}
21+
return dp2[n - 1];
22+
}
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
class Solution:
2+
def minCut(self, s: str) -> int:
3+
n = len(s)
4+
dp1 = [[False] * n for _ in range(n)]
5+
for i in range(n - 1, -1, -1):
6+
for j in range(i, n):
7+
dp1[i][j] = s[i] == s[j] and (j - 1 < 3 or dp1[i + 1][j - 1])
8+
dp2 = [0] * n
9+
for i in range(n):
10+
if not dp1[0][i]:
11+
dp2[i] = i
12+
for j in range(1, i + 1):
13+
if dp1[j][i]:
14+
dp2[i] = min(dp2[i], dp2[j - 1] + 1)
15+
return dp2[-1]

solution/0100-0199/0132.Palindrome Partitioning II/README.md

+104-1
Original file line numberDiff line numberDiff line change
@@ -51,22 +51,125 @@
5151

5252
<!-- 这里可写通用的实现逻辑 -->
5353

54+
两次 dp,`dp1[i][j]` 表示 i ~ j 的子串是否是回文,可以参考 [5. 最长回文子串](../../0000-0099/0005.Longest%20Palindromic%20Substring/README.md)`dp2[i]` 表示以 i 结尾的子串最少需要分割几次,如果本来就是回文串(`dp[0][i] == true`)就不需要分割,否则枚举分割点 `j`
55+
5456
<!-- tabs:start -->
5557

5658
### **Python3**
5759

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

6062
```python
61-
63+
class Solution:
64+
def minCut(self, s: str) -> int:
65+
n = len(s)
66+
dp1 = [[False] * n for _ in range(n)]
67+
for i in range(n - 1, -1, -1):
68+
for j in range(i, n):
69+
dp1[i][j] = s[i] == s[j] and (j - i < 3 or dp1[i + 1][j - 1])
70+
dp2 = [0] * n
71+
for i in range(n):
72+
if not dp1[0][i]:
73+
dp2[i] = i
74+
for j in range(1, i + 1):
75+
if dp1[j][i]:
76+
dp2[i] = min(dp2[i], dp2[j - 1] + 1)
77+
return dp2[-1]
6278
```
6379

6480
### **Java**
6581

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

6884
```java
85+
class Solution {
86+
public int minCut(String s) {
87+
int n = s.length();
88+
boolean[][] dp1 = new boolean[n][n];
89+
for (int i = n - 1; i >= 0; i--) {
90+
for (int j = i; j < n; j++) {
91+
dp1[i][j] = s.charAt(i) == s.charAt(j) && (j - i < 3 || dp1[i + 1][j - 1]);
92+
}
93+
}
94+
int[] dp2 = new int[n];
95+
for (int i = 0; i < n; i++) {
96+
if (!dp1[0][i]) {
97+
dp2[i] = i;
98+
for (int j = 1; j <= i; j++) {
99+
if (dp1[j][i]) {
100+
dp2[i] = Math.min(dp2[i], dp2[j - 1] + 1);
101+
}
102+
}
103+
}
104+
}
105+
return dp2[n - 1];
106+
}
107+
}
108+
```
109+
110+
### **Go**
111+
112+
```go
113+
func minCut(s string) int {
114+
n := len(s)
115+
dp1 := make([][]bool, n)
116+
for i := 0; i < n; i++ {
117+
dp1[i] = make([]bool, n)
118+
}
119+
for i := n - 1; i >= 0; i-- {
120+
for j := i; j < n; j++ {
121+
dp1[i][j] = s[i] == s[j] && (j-i < 3 || dp1[i+1][j-1])
122+
}
123+
}
124+
dp2 := make([]int, n)
125+
for i := 0; i < n; i++ {
126+
if !dp1[0][i] {
127+
dp2[i] = i
128+
for j := 1; j <= i; j++ {
129+
if dp1[j][i] {
130+
dp2[i] = min(dp2[i], dp2[j-1]+1)
131+
}
132+
}
133+
}
134+
}
135+
return dp2[n-1]
136+
}
137+
138+
func min(x, y int) int {
139+
if x < y {
140+
return x
141+
}
142+
return y
143+
}
144+
```
69145

146+
### **C++**
147+
148+
```cpp
149+
class Solution {
150+
public:
151+
int minCut(string s) {
152+
int n = s.size();
153+
vector<vector<bool>> dp1(n, vector<bool>(n));
154+
for (int i = n - 1; i >= 0; --i) {
155+
for (int j = i; j < n; ++j) {
156+
dp1[i][j] = s[i] == s[j] && (j - i < 3 || dp1[i + 1][j - 1]);
157+
}
158+
}
159+
vector<int> dp2(n);
160+
for (int i = 0; i < n; ++i) {
161+
if (!dp1[0][i]) {
162+
dp2[i] = i;
163+
for (int j = 1; j <= i; ++j) {
164+
if (dp1[j][i]) {
165+
dp2[i] = min(dp2[i], dp2[j - 1] + 1);
166+
}
167+
}
168+
}
169+
}
170+
return dp2[n - 1];
171+
}
172+
};
70173
```
71174
72175
### **...**

0 commit comments

Comments
 (0)