Skip to content

Commit 57e2c78

Browse files
committed
feat: add solutions to lc/lcof2 problems
lc No.0131, lcof2 No.086: Palindrome Partitioning
1 parent 8b3d0d1 commit 57e2c78

File tree

11 files changed

+676
-35
lines changed

11 files changed

+676
-35
lines changed

lcof2/剑指 Offer II 086. 分割回文子字符串/README.md

Lines changed: 143 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@
4343

4444
<p><meta charset="UTF-8" />注意:本题与主站 131&nbsp;题相同:&nbsp;<a href="https://leetcode-cn.com/problems/palindrome-partitioning/">https://leetcode-cn.com/problems/palindrome-partitioning/</a></p>
4545

46-
4746
## 解法
4847

4948
<!-- 这里可写通用的实现逻辑 -->
@@ -55,15 +54,157 @@
5554
<!-- 这里可写当前语言的特殊实现逻辑 -->
5655

5756
```python
58-
57+
class Solution:
58+
def partition(self, s: str) -> List[List[str]]:
59+
ans = []
60+
n = len(s)
61+
dp = [[True] * n for _ in range(n)]
62+
for i in range(n - 1, -1, -1):
63+
for j in range(i + 1, n):
64+
dp[i][j] = s[i] == s[j] and dp[i + 1][j - 1]
65+
66+
def dfs(s, i, t):
67+
nonlocal n
68+
if i == n:
69+
ans.append(t.copy())
70+
return
71+
for j in range(i, n):
72+
if dp[i][j]:
73+
t.append(s[i: j + 1])
74+
dfs(s, j + 1, t)
75+
t.pop(-1)
76+
77+
dfs(s, 0, [])
78+
return ans
5979
```
6080

6181
### **Java**
6282

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

6585
```java
86+
class Solution {
87+
private boolean[][] dp;
88+
private List<List<String>> ans;
89+
private int n;
90+
91+
public String[][] partition(String s) {
92+
ans = new ArrayList<>();
93+
n = s.length();
94+
dp = new boolean[n][n];
95+
for (int i = 0; i < n; ++i) {
96+
Arrays.fill(dp[i], true);
97+
}
98+
for (int i = n - 1; i >= 0; --i) {
99+
for (int j = i + 1; j < n; ++j) {
100+
dp[i][j] = s.charAt(i) == s.charAt(j) && dp[i + 1][j - 1];
101+
}
102+
}
103+
dfs(s, 0, new ArrayList<>());
104+
String [][] res = new String [ans.size()][];
105+
for (int i = 0; i < ans.size(); ++i) {
106+
res[i] = ans.get(i).toArray(new String[0]);
107+
}
108+
return res;
109+
}
110+
111+
private void dfs(String s, int i, List<String> t) {
112+
if (i == n) {
113+
ans.add(new ArrayList<>(t));
114+
return;
115+
}
116+
for (int j = i; j < n; ++j) {
117+
if (dp[i][j]) {
118+
t.add(s.substring(i, j + 1));
119+
dfs(s, j + 1, t);
120+
t.remove(t.size() - 1);
121+
}
122+
}
123+
}
124+
}
125+
```
126+
127+
### **C++**
128+
129+
```cpp
130+
class Solution {
131+
public:
132+
vector<vector<bool>> dp;
133+
vector<vector<string>> ans;
134+
int n;
135+
136+
vector<vector<string>> partition(string s) {
137+
n = s.size();
138+
dp.assign(n, vector<bool>(n, true));
139+
for (int i = n - 1; i >= 0; --i)
140+
{
141+
for (int j = i + 1; j < n; ++j)
142+
{
143+
dp[i][j] = s[i] == s[j] && dp[i + 1][j - 1];
144+
}
145+
}
146+
vector<string> t;
147+
dfs(s, 0, t);
148+
return ans;
149+
}
150+
151+
void dfs(string& s, int i, vector<string> t) {
152+
if (i == n)
153+
{
154+
ans.push_back(t);
155+
return;
156+
}
157+
for (int j = i; j < n; ++j)
158+
{
159+
if (dp[i][j])
160+
{
161+
t.push_back(s.substr(i, j - i + 1));
162+
dfs(s, j + 1, t);
163+
t.pop_back();
164+
}
165+
}
166+
}
167+
};
168+
```
66169
170+
### **Go**
171+
172+
```go
173+
func partition(s string) [][]string {
174+
n := len(s)
175+
dp := make([][]bool, n)
176+
var ans [][]string
177+
for i := 0; i < n; i++ {
178+
dp[i] = make([]bool, n)
179+
for j := 0; j < n; j++ {
180+
dp[i][j] = true
181+
}
182+
}
183+
for i := n - 1; i >= 0; i-- {
184+
for j := i + 1; j < n; j++ {
185+
dp[i][j] = s[i] == s[j] && dp[i+1][j-1]
186+
}
187+
}
188+
189+
var dfs func(s string, i int, t []string)
190+
dfs = func(s string, i int, t []string) {
191+
if i == n {
192+
ans = append(ans, append([]string(nil), t...))
193+
return
194+
}
195+
for j := i; j < n; j++ {
196+
if dp[i][j] {
197+
t = append(t, s[i:j+1])
198+
dfs(s, j+1, t)
199+
t = t[:len(t)-1]
200+
}
201+
}
202+
}
203+
204+
var t []string
205+
dfs(s, 0, t)
206+
return ans
207+
}
67208
```
68209

69210
### **...**
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
class Solution {
2+
public:
3+
vector<vector<bool>> dp;
4+
vector<vector<string>> ans;
5+
int n;
6+
7+
vector<vector<string>> partition(string s) {
8+
n = s.size();
9+
dp.assign(n, vector<bool>(n, true));
10+
for (int i = n - 1; i >= 0; --i)
11+
{
12+
for (int j = i + 1; j < n; ++j)
13+
{
14+
dp[i][j] = s[i] == s[j] && dp[i + 1][j - 1];
15+
}
16+
}
17+
vector<string> t;
18+
dfs(s, 0, t);
19+
return ans;
20+
}
21+
22+
void dfs(string& s, int i, vector<string> t) {
23+
if (i == n)
24+
{
25+
ans.push_back(t);
26+
return;
27+
}
28+
for (int j = i; j < n; ++j)
29+
{
30+
if (dp[i][j])
31+
{
32+
t.push_back(s.substr(i, j - i + 1));
33+
dfs(s, j + 1, t);
34+
t.pop_back();
35+
}
36+
}
37+
}
38+
};
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
func partition(s string) [][]string {
2+
n := len(s)
3+
dp := make([][]bool, n)
4+
var ans [][]string
5+
for i := 0; i < n; i++ {
6+
dp[i] = make([]bool, n)
7+
for j := 0; j < n; j++ {
8+
dp[i][j] = true
9+
}
10+
}
11+
for i := n - 1; i >= 0; i-- {
12+
for j := i + 1; j < n; j++ {
13+
dp[i][j] = s[i] == s[j] && dp[i+1][j-1]
14+
}
15+
}
16+
17+
var dfs func(s string, i int, t []string)
18+
dfs = func(s string, i int, t []string) {
19+
if i == n {
20+
ans = append(ans, append([]string(nil), t...))
21+
return
22+
}
23+
for j := i; j < n; j++ {
24+
if dp[i][j] {
25+
t = append(t, s[i:j+1])
26+
dfs(s, j+1, t)
27+
t = t[:len(t)-1]
28+
}
29+
}
30+
}
31+
32+
var t []string
33+
dfs(s, 0, t)
34+
return ans
35+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
class Solution {
2+
private boolean[][] dp;
3+
private List<List<String>> ans;
4+
private int n;
5+
6+
public String[][] partition(String s) {
7+
ans = new ArrayList<>();
8+
n = s.length();
9+
dp = new boolean[n][n];
10+
for (int i = 0; i < n; ++i) {
11+
Arrays.fill(dp[i], true);
12+
}
13+
for (int i = n - 1; i >= 0; --i) {
14+
for (int j = i + 1; j < n; ++j) {
15+
dp[i][j] = s.charAt(i) == s.charAt(j) && dp[i + 1][j - 1];
16+
}
17+
}
18+
dfs(s, 0, new ArrayList<>());
19+
String [][] res = new String [ans.size()][];
20+
for (int i = 0; i < ans.size(); ++i) {
21+
res[i] = ans.get(i).toArray(new String[0]);
22+
}
23+
return res;
24+
}
25+
26+
private void dfs(String s, int i, List<String> t) {
27+
if (i == n) {
28+
ans.add(new ArrayList<>(t));
29+
return;
30+
}
31+
for (int j = i; j < n; ++j) {
32+
if (dp[i][j]) {
33+
t.add(s.substring(i, j + 1));
34+
dfs(s, j + 1, t);
35+
t.remove(t.size() - 1);
36+
}
37+
}
38+
}
39+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
class Solution:
2+
def partition(self, s: str) -> List[List[str]]:
3+
ans = []
4+
n = len(s)
5+
dp = [[True] * n for _ in range(n)]
6+
for i in range(n - 1, -1, -1):
7+
for j in range(i + 1, n):
8+
dp[i][j] = s[i] == s[j] and dp[i + 1][j - 1]
9+
10+
def dfs(s, i, t):
11+
nonlocal n
12+
if i == n:
13+
ans.append(t.copy())
14+
return
15+
for j in range(i, n):
16+
if dp[i][j]:
17+
t.append(s[i: j + 1])
18+
dfs(s, j + 1, t)
19+
t.pop(-1)
20+
21+
dfs(s, 0, [])
22+
return ans

0 commit comments

Comments
 (0)